3.6 备忘录模式
备忘录模式(Memento)在不破坏封装的前提下,捕获一个对象的内部状态并保存到外部,之后能把对象恢复到这个状态。一句话:它是“撤销”和“存档”的对象化表达。
下面的实验:调整一个状态值并随时“保存快照”,然后点击时间线上的任意快照即可恢复——快照的内部细节对你是不透明的。
正在加载交互实验...
三个角色,各司其职
java
class Editor { // Originator:状态的拥有者
private String content;
Memento save() { return new Memento(content); } // 创建快照
void restore(Memento m) { content = m.getState(); } // 恢复
static class Memento { // 备忘录:不透明的状态容器
private final String state;
private Memento(String state) { this.state = state; }
private String getState() { return state; }
}
}
class History { // Caretaker:只保管,不窥探
private Deque<Editor.Memento> stack = new ArrayDeque<>();
}- Originator(发起人):拥有状态,负责创建和恢复备忘录。
- Memento(备忘录):保存状态的对象,只对发起人开放内部。
- Caretaker(管理者):保管备忘录(如撤销栈),但绝不读取或修改它的内容。
这种“管理者保管却不窥探”的设计,正是它不破坏封装的关键。下面的编辑器实验让你打字、存档、再恢复到任意版本。
正在加载交互实验...
正在加载概念检查...
正在加载概念检查...
代价与现实
- 内存:频繁、全量地保存快照会很耗内存。常见优化是只存增量(差异),或限制历史深度。
- 与命令模式配合:撤销系统里,备忘录擅长保存“状态”,命令擅长保存“操作”。复杂编辑器常常二者结合:命令记录做了什么,备忘录在必要时整存整取。
游戏存档、数据库事务回滚、IDE 的本地历史,背后都有备忘录的影子。
正在加载本节练习...