Memento Pattern

Memento is a behavioral pattern that is used to restore state of an object to a previous state.

Memento pattern uses three actor classes. Memento class contains state of an object to be restored. Originator class creates and stores states in Memento objects and CareTaker class object is responsible to restore object state from Memento. In the following example MementoPatternDemo will use CareTaker and Originator objects to show restoration of objects (Memento) states.

Memento Pattern UML Diagram

Step 1 : Create Memento class

public class Memento {
private String state;

public Memento(String state) {
this.state = state;
}

public String getState() {
return state;
}
}

Step 2 : Create Originator class

public class Originator {
private String state;

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

public Memento saveStateToMemento() {
return new Memento(state);
}

public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
}

Step 3 : Create Caretaker class

public class CareTaker {
private List<Memento> mementoList = new ArrayList<>();

public void add(Memento state) {
mementoList.add(state);
}

public Memento get(int index) {
return mementoList.get(index);
}
}

Step 4 : Use CareTaker and Originator objects

public class MementoPatternDemo {
public static void main(String[] args) {

Originator originator = new Originator();
CareTaker careTaker = new CareTaker();

originator.setState("State #1");
originator.setState("State #2");
careTaker.add(originator.saveStateToMemento());

originator.setState("State #3");
careTaker.add(originator.saveStateToMemento());

originator.setState("State #4");
System.out.println("Current State: " + originator.getState());

originator.getStateFromMemento(careTaker.get(0));
System.out.println("First saved State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(1));
System.out.println("Second saved State: " + originator.getState());
}
}

The output will be : 

Current State: State #4
First saved State: State #2
Second saved State: State #3

Leave a Reply

Your email address will not be published. Required fields are marked *