【设计模式】行为型-备忘录模式
文章目录前言一、概念二、核心结构三、Java 代码实现编辑器撤销1. 备忘录快照2. 原发器编辑器3. 看管人历史记录4. 客户端测试四、严格封装最佳实践五、优缺点优点缺点六、应用场景七、备忘录 VS 命令 VS 状态八、总结前言开发中经常需要撤销、回滚、快照、恢复功能比如编辑器 CtrlZ、游戏存档、订单回滚、配置恢复。如果直接把对象内部状态暴露出去会破坏封装如果自己管理备份代码又会臃肿。备忘录模式就是专门解决状态备份与恢复、且不破坏封装的行为型设计模式。一、概念备忘录模式Memento Pattern是一种行为型设计模式核心思想在不破坏封装性的前提下捕获一个对象的内部状态并在该对象之外保存这个状态以便以后可以将该对象恢复到原先保存的状态。简单理解原发器Originator要备份的对象如编辑器备忘录Memento存储状态的快照不可篡改看管人Caretaker只负责保存快照不看内容一句话总结存档 → 快照 → 读档且快照内容谁都不能改。二、核心结构Originator原发器创建备忘录、从备忘录恢复状态。Memento备忘录存储内部状态只允许原发器读取。Caretaker看管人持有备忘录不能访问/修改内容只负责存和取。三、Java 代码实现编辑器撤销场景编辑器内容备份与恢复CtrlZ1. 备忘录快照// 备忘录存储状态不可修改publicclassEditorMemento{privatefinalStringcontent;publicEditorMemento(Stringcontent){this.contentcontent;}// 只给原发器用publicStringgetContent(){returncontent;}}2. 原发器编辑器// 原发器创建快照、恢复快照publicclassEditor{privateStringcontent;publicvoidsetContent(Stringcontent){this.contentcontent;}publicStringgetContent(){returncontent;}// 创建备忘录存档publicEditorMementocreateMemento(){returnnewEditorMemento(content);}// 从备忘录恢复读档publicvoidrestoreFromMemento(EditorMementomemento){this.contentmemento.getContent();}}3. 看管人历史记录// 看管人只保存备忘录不看内容publicclassHistory{privateEditorMementomemento;publicvoidsetMemento(EditorMementomemento){this.mementomemento;}publicEditorMementogetMemento(){returnmemento;}}4. 客户端测试publicclassClient{publicstaticvoidmain(String[]args){EditoreditornewEditor();HistoryhistorynewHistory();// 编辑内容editor.setContent(第1版内容);// 存档history.setMemento(editor.createMemento());// 修改editor.setContent(第2版修改内容);System.out.println(当前editor.getContent());// 撤销恢复editor.restoreFromMemento(history.getMemento());System.out.println(撤销后editor.getContent());}}输出当前第2版修改内容 撤销后第1版内容四、严格封装最佳实践为了防止外部篡改备忘录通常做法Memento 设为私有内部类只暴露窄接口空接口给 Caretaker只有 Originator 能访问宽接口这样绝对安全不会破坏封装。五、优缺点优点不破坏封装实现备份/恢复职责分离原发器管业务看管人管存储可实现撤销、回滚、快照、重做易于实现多版本管理缺点频繁备份会消耗大量内存状态复杂时备忘录管理成本高某些语言难以保证备忘录不可篡改六、应用场景编辑器撤销CtrlZ游戏存档/读档事务回滚、订单取消配置恢复、系统快照虚拟机 checkpoint、容器快照经典应用IDEA/Eclipse 撤销重做Git commit可理解为备忘录Spring StateMachine 状态保存database transaction rollback七、备忘录 VS 命令 VS 状态备忘录保存/恢复状态命令封装行为支持撤销状态状态决定行为八、总结备忘录模式 快照 存档 恢复核心不破坏封装安全备份状态结构OriginatorMementoCaretaker是实现撤销、回滚、存档最标准的设计模式