Memento Pattern
Pros
- Allows previous state restoration of an object without compromising encapsulation
Cons
- If the originator object uses a lot of memory then the memento states will increase the problem
Example Explanation

import java.util.List;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Originator org = new Originator("first");
CareTaker care = new CareTaker();
System.out.println(org.getState());//first
care.saveMemento(org.createMemento());
org.setState("second");
care.saveMemento(org.createMemento());
System.out.println(org.getState());//second
org.setState("third");
care.saveMemento(org.createMemento());
System.out.println(org.getState());//third
org.setState("fourth");
System.out.println(org.getState());//fourth
org.setMemento( care.getMemento(0) );
System.out.println(org.getState());//first
org.setMemento( care.getLastSavedMemento() );
System.out.println(org.getState());//third
}
}
class Memento{
private String state;
public Memento(String state){
this.state = state;
}
public String getState(){ return state; }
public void setState(){ this.state = state; }
}
class Originator{
private String state;
public Originator(String startingState){
this.state = startingState;
}
public Memento createMemento(){
return new Memento(state);
}
public void setMemento(Memento memento){
this.state = memento.getState();
}
public void setState(String newState){
this.state = newState;
}
public String getState(){ return state; }
}
class CareTaker{
List<Memento> list = new ArrayList<Memento>();
public void saveMemento(Memento memento){
list.add(memento);
}
public Memento getMemento(int index){
return list.get(index);
}
public Memento getLastSavedMemento(){
if(list.size() > 0) return list.get(list.size()-1);
return null;
}
}
Extra Resources