The Memento Pattern is a behavioral design pattern that provides a way to
capture and restore an object’s state without exposing its internal details.
This pattern is particularly useful for implementing undo functionality and
maintaining encapsulation in software design.
classMemento<T>{constructor(privatereadonlystate: T){}getState():T{returnthis.state;}}classOriginator<T>{constructor(privatestate: T){}setMemento(memento: Memento<T>):void{this.state=memento.getState();}createMemento():Memento<T>{returnnewMemento<T>(this.state);}_changeState(state: T):void{this.state=state;}_showState():void{console.log(this.state);}}classCaretaker<T>{privatememento: Memento<T>|undefined;// Make memento optional
constructor(privatereadonlyoriginator: Originator<T>){}doCommand():void{this.memento=this.originator.createMemento();// Store the memento
// ... do something that changes the originator's state...
}undoCommand():void{if(this.memento){// Check if a memento exists
this.originator.setMemento(this.memento);}else{console.log("Cannot undo, no memento stored.");}}}constclient={run():void{constoriginator=newOriginator<string>("foo");// Type the originator
constcaretaker=newCaretaker<string>(originator);originator._showState();// Output: foo
caretaker.doCommand();// Save "foo" memento
originator._changeState("bar");originator._showState();// Output: bar
caretaker.undoCommand();originator._showState();// Output: foo
caretaker.doCommand();// Save "bar" memento
originator._changeState("baz");originator._showState();// Output: baz
caretaker.undoCommand();originator._showState();// Output: bar
caretaker.undoCommand();// Call undo again
originator._showState();// Output: bar (still bar, because "foo" memento is gone)
}};client.run();