The memento pattern is a software design pattern that provides the ability to restore an object to itsprevious state (undo via rollback).
The memento pattern is implemented with two objects: the originator and a caretaker. The originator is some object that has an internal state. The caretaker is going to do something to the originator, but wants to be able to undo the change. The caretaker first asks the originator for a memento object. Then it does whatever operation (or sequence of operations) it was going to do. To roll back to the state before the operations, it returns the memento object to the originator. The memento object itself is an opaque object (one which the caretaker cannot, or should not, change). When using this pattern, care should be taken if the originator may change other objects or resources – the memento
pattern operates on a single object.
Classic examples of the memento pattern include the seed of a pseudorandom number generator (it will always produce the same sequence thereafter when initialized with the seed state) and the state in a finite state machine.
The following Java program illustrates the “undo” usage of the Memento Pattern.
Below example uses a String as the state, which by default is an immutable type in java. In real life scenarios the state will almost always be an object. In which case the state has to be cloned before putting in the memento.
It must be said that this latter implementation has a drawback: it declares an internal class. Better would be that the memento strategy could apply on more that one object.
There are mainly 3 other ways to achieve Memento: 1- Serialization. 2- A class declared in the same package. 3- The
object can also be accessed via a proxy, which can achieve any save/restore operation on the object.