备忘录模式
About 2 min
备忘录模式可以保持对象状态的快照,这样对象可以在不向外界公开其内容的情况下返回到它的最初状态。
备忘录模式的主要角色:
- 发起人(Originator) - 需要保存状态的对象。它可以创建一个备忘录,用来记录当前时刻的内部状态。
- 备忘录(Memento) - 用于存储发起人对象的内部状态。
- 管理者(Caretaker) - 管理Memento角色,负责保存好备忘录。
代码实现
发起人
发起人持有需要保存的状态,并且提供创建备忘录,和恢复状态的方法。
public class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public String getState() {
return this.state;
}
public void setMemento(Memento memento) {
// 恢复状态
this.state = memento.getState();
}
public Memento createMemento() {
return new Memento(this.state);
}
}
备忘录
备忘录中持有状态字段,用于记录发起人的状态。
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return this.state;
}
}
管理者
管理者通过mementoList
记录所有的状态变化,可以将发起人的状态还原到任意时刻。
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);
}
}
使用方法
通过发起人对象来创建备忘录,并且通过管理者对象来保存备忘录。
每次发起人状态改变的时候,我们都通过originator.createMemento
创建当前状态的备忘录;之后通过caretaker.add
记录备忘录。
状态还原时,通过caretaker.get
获取某个时刻的备忘录,通过originator.setMemento
恢复状态。
public class Client {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
originator.setState("State #1");
caretaker.add(originator.createMemento());
originator.setState("State #2");
caretaker.add(originator.createMemento());
originator.setState("State #3");
caretaker.add(originator.createMemento());
originator.setMemento(caretaker.get(0));
System.out.println(originator.getState());
originator.setMemento(caretaker.get(1));
System.out.println(originator.getState());
originator.setMemento(caretaker.get(2));
System.out.println(originator.getState());
}
}
结果: