Memento Pattern - Example

Example

The following Java program illustrates the "undo" usage of the Memento Pattern.

import java.util.List; import java.util.ArrayList; class Originator { private String state; // The class could also contain additional data that is not part of the // state saved in the memento. public void set(String state) { System.out.println("Originator: Setting state to " + state); this.state = state; } public Memento saveToMemento { System.out.println("Originator: Saving to Memento."); return new Memento(state); } public void restoreFromMemento(Memento memento) { state = memento.getSavedState; System.out.println("Originator: State after restoring from Memento: " + state); } public static class Memento { private final String state; public Memento(String stateToSave) { state = stateToSave; } public String getSavedState { return state; } } } class Caretaker { public static void main(String args) { List savedStates = new ArrayList; Originator originator = new Originator; originator.set("State1"); originator.set("State2"); savedStates.add(originator.saveToMemento); originator.set("State3"); // We can request multiple mementos, and choose which one to roll back to. savedStates.add(originator.saveToMemento); originator.set("State4"); originator.restoreFromMemento(savedStates.get(1)); } }

The output is:

Originator: Setting state to State1 Originator: Setting state to State2 Originator: Saving to Memento. Originator: Setting state to State3 Originator: Saving to Memento. Originator: Setting state to State4 Originator: State after restoring from Memento: State3

This 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.

private Memento(State state) { //state has to be cloned before returning the //memento, or successive calls to get Memento //return a reference to the same object this.mementoState = state.clone; }

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.

Read more about this topic:  Memento Pattern

Famous quotes containing the word example:

    Our intellect is not the most subtle, the most powerful, the most appropriate, instrument for revealing the truth. It is life that, little by little, example by example, permits us to see that what is most important to our heart, or to our mind, is learned not by reasoning but through other agencies. Then it is that the intellect, observing their superiority, abdicates its control to them upon reasoned grounds and agrees to become their collaborator and lackey.
    Marcel Proust (1871–1922)