1. 类图
2. 角色
- Memento:包含了要被恢复的对象的状态
- Originator:创建新的Memento;或者设置Memento中的状态
- CareTaker:记录Memento的历史状态
3. 代码
- Memento
-
public class Memento { private String state; public Memento(String state){ this.state = state; } public String getState(){ return state; } }
-
- Originator
-
public class Originator { private String state; public void setState(String state){ this.state = state; } public String getState(){ return state; } public Memento saveStateToMemento(){ return new Memento(state); } public void getStateFromMemento(Memento Memento){ state = Memento.getState(); } }
-
- CareTaker
-
import java.util.ArrayList; import java.util.List; public class CareTaker { private List<Memento> mementoList = new ArrayList<Memento>(); public void add(Memento state){ mementoList.add(state); } public Memento get(int index){ return mementoList.get(index); } }
-
- 客户端调用
-
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()); //Current State: State #4 originator.getStateFromMemento(careTaker.get(0)); System.out.println("First saved State: " + originator.getState()); //First saved State: State #2 originator.getStateFromMemento(careTaker.get(1)); System.out.println("Second saved State: " + originator.getState()); //Second saved State: State #3 } }
-
4. 总结
优点
- 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
- 实现了信息的封装,使得用户不需要关心状态的保存细节
缺点
- 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存