In this article I would like to experiment with the Memento pattern. Memento pattern provides an Object Oriented way of saving the state of an object. The state called as Memento can be used to restore the object later.
The English meaning of Memento is Reminder of Past Events.
You are working on a Drawing application which allows the user to draw lines on a Canvas. The user should be able to Save the state on particular intervals so any further mistakes could be undone. You need to provide a solution for the problem.
“Without violating encapsulation, capture and externalize an object’s internal state so that the object can be restored to this state later”
The above problem can be solved using the Memento Pattern. This pattern as said in the definition saves the internal state of the object for restoring later. The object state is saved without violating Encapsulation.
Following is the Drawing class definition:
The AddLine() method allows to add line on the graphics. These information are stored inside the _list object as state.
The CreateMemento() allows to get a copy of the internal state without violating Encapsulation.
The RestoreMemento() allows to restore the state to the given memento.
Following is the Memento class definition:
It contains the State property to hold the State of Drawing class.
Executing the Application
You can try executing the attached application. After executing draw a series of lines in the Canvas and use the Save button to save the memento.
Now try to add some unwanted lines:
Use the Restore State to get the old valid state.
So this concludes our application implementing Memento pattern.
Comparing Command and Memento Patterns
The Command pattern also provides the Undo / Redo functionality by converting actions to commands. The difference would be that the Command pattern stores each action but the Memento pattern saves the state only on request.
Additionally, the Command pattern has Undo and Redo operations for each action, but the Memento does not need that.
Depending on the scenario, Command / Memento pattern could be used.
In this article we have explore the Memento pattern. The attached source code contains the example we discussed.