备忘录模式
1.定义
备忘录(Memento)模式: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.
2.实现
备忘录(Memento)模式
- 原发器(Originator)角色
- 负责人(Caretaker)角色
- 备忘录(Memento)角色
原发器(Originator)角色:业务类
/**
* 业务类
*/
public class Originator {
private String state;
public Originator() {
}
// 创建一个备忘录对象
public Memento createMemento() {
return new Memento(this);
}
// 根据备忘录对象恢复原发器状态
public void restoreMemento(Memento m) {
state = m.getState();
}
// ... setter/getter
}
备忘录(Memento)角色:存储原发器的内部状态,根据原发器来决定保存哪些内部状态
/**
* Memento角色
*/
public class Memento {
private String state;
public Memento(Originator o) {
state = o.getState();
}
// ... setter/getter
}
负责人(Caretaker)角色:负责保存备忘录,但是不能对备忘录的内容进行操作或检查
/**
* 负责人(Caretaker)角色
*/
public class Caretaker {
private Map<String, Memento> map = new HashMap<String, Memento>();
public Memento recoveryMemento(String state) {
return map.get(state);
}
public void saveMemento(String state, Memento memento) {
this.map.put(state, memento);
}
}
测试客户端
/**
* 测试客户端
*/
public class MementoClient {
public static void main(String[] args) {
// 新建业务模型
Originator originator = new Originator();
originator.setState("StateA");
// 新建备忘录
Memento memento = originator.createMemento();
// 保持备忘录记录
Caretaker caretaker = new Caretaker();
caretaker.saveMemento(memento.getState(), memento);
Originator newOriginator = new Originator();
newOriginator.setState("StateB");
memento = newOriginator.createMemento();
caretaker.saveMemento(memento.getState(), memento);
// 撤销
System.out.println("撤销状态StateB");
Memento recoveryMemento = caretaker.recoveryMemento("StateB");
originator.restoreMemento(recoveryMemento);
System.out.println(originator.getState());
}
}