备忘录模式(Memento)
定义
在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
使用场景
主要角色
- 发起人 Originator 需要备份的对象
- 看管人 Caretaker 保存备份的容器
- 备忘录 Memento 备份对象
类图
示例代码
需要备份的对象
public class Originator {private String state1;private String state2;private String staten;void setState1(String state1) {this.state1 = state1;}String getState1() {return state1;}// 创建备忘录Memento createMemento() {Memento memento = new Memento();memento.setState1(state1);memento.setStaten(staten);return memento;}// 恢复状态void restoreMemento(Memento memento) {this.state1 = memento.getState1();this.staten = memento.getStaten();}
}
备份对象
@Data
public class Memento {private String state1;private String staten;
}
看管人:负责管理备份
public class Caretaker {private final Map<String,Memento> history = new HashMap<>();// 保存备忘录public void saveMemento(String name,Memento memento) {history.put(name,memento);}// 获取备忘录public Memento getMemento(String name) {return history.get(name);}public Memento removeMemento(String name) {return history.remove(name);}
}
public class Client {public static void main(String[] args) {// 创建发起人Originator originator = new Originator();// 创建负责人Caretaker caretaker = new Caretaker();// 设置发起人的状态originator.setState1("State 1");System.out.println("Current State: " + originator.getState1());// 保存状态caretaker.saveMemento("第一次备份", originator.createMemento());// 修改发起人的状态originator.setState1("State 2");System.out.println("Updated State: " + originator.getState1());// 恢复状态originator.restoreMemento(caretaker.getMemento("第一次备份"));System.out.println("Restored State: " + originator.getState1());}
}
Current State: State 1
Updated State: State 2
Restored State: State 1
备忘录模式与命令模式对比
- 两者都能实现回退与撤销操作
- 命令模式是通过反向命令实现的,只能逐步回退或撤销,备忘录模式生产生产当前对象的快照,可以恢复到任意备份点