核心内容摘要
2025,B站四川少女的次元狂欢!你准备好一起“出川”了吗?
文章目录
个人感悟
概念
适配场景
1 适合的场景
2 常见场景举例
实现方法
1 实现思路
2 UML类图
3 代码示例
优缺点
1 优点
2 缺点
源码分析
1 Java Swing中的UndoManager
个人感悟备忘录模式的场景也比较专。
适合进行备份、恢复模式优点很明显状态保存于业务逻辑分离实现解耦一个注意的点是窄接口设计Memento(备忘录)内部保存了Originator原发器的状态但这个状态不应该被除了Originator之外的其他对象特别是Caretaker直接访问或修改以保护状态的封装性。
具体可以看看示例代码
概念英文定义(《设计模式可复用面向对象软件的基础》)Without violating encapsulation, capture and externalize an object,t internal state so that the object can be restored this state later.中文翻译在不破坏封装性的前提下捕获一个对象的内部状态并在该对象之外保存这个状态以便以后可以将对象恢复到原先保存的状态。
理解备忘录模式提供了一种状态恢复机制允许对象回到某个历史状态它通过独立的对象备忘录来存储状态而不是由原对象自己保存实现了状态保存与业务逻辑的分离原对象专注于业务管理者专注于状态管理
适配场景
1 适合的场景需要撤销/重做功能如文本编辑器、绘图软件的操作历史需要保存快照/检查点如游戏存档、系统配置备份状态转换复杂如工作流引擎的状态管理需要事务回滚如数据库操作的事务管理原型状态保存如复杂对象构造过程中的中间状态保存需要版本控制如文档编辑的历史版本管理
2 常见场景举例IDE开发环境Eclipse/IntelliJ IDEA的代码编辑撤销功能绘图软件Photoshop的历史记录面板游戏开发游戏进度存档/读档系统表单应用多步表单的回退功能配置管理系统配置的备份与恢复数据库系统事务的rollback机制
实现方法
1 实现思路识别状态数据确定需要保存的内部状态字段创建Memento类设计存储状态的数据结构在Originator中添加状态管理创建保存状态的方法saveToMemento()创建恢复状态的方法restoreFromMemento()设计Caretaker类决定存储策略栈、列表、树等实现状态管理逻辑撤销、重做、清空等控制访问权限对Originator开放宽接口可读写状态对Caretaker开放窄接口只读元数据
2 UML类图角色说明Originator原发器需要保存状态的对象负责创建和恢复备忘录Memento备忘录存储Originator内部状态通常设计为不可变对象Caretaker管理者负责保存和管理备忘录但不能操作备忘录内容
3 代码示例背景以文件编辑器为例简化业务只有保存和撤销功能设计原发器publicclassTextEditor{privateStringcontent;publicStringgetContent(){returncontent;}publicvoidsetContent(Stringcontent){this.contentcontent;}publicTextEditor(Stringcontent){this.contentcontent;}/** * description 创建备忘 * author bigHao * date 2026/1/27 * return designpattern.memento.pac.TextMemento 备忘录 **/publicTextMementocreateMemento(){returnnewTextMemento(content);}/** * description 恢复备忘 * author bigHao * date 2026/1/27 * param memento 备忘录 **/publicvoidrestoreMemento(TextMementomemento){this.contentmemento.getContent();}}备忘录注意权限控制。
备忘录只有原发器可以创建和访问内容。
实际操作中将二者放到一个包下相关方法使用包权限publicclassTextMemento{privateStringcontent;// 包访问权限仅对Originator开放状态访问TextMemento(Stringcontent){this.contentcontent;}StringgetContent(){returncontent;}}管理者publicclassCaretaker{privatestaticfinalintMAX_SIZE100;// 业务场景刚好使用stack 先进后出privateStackTextMementohistorynewStack();publicvoidpush(TextMementomemento){// 限制下长度limitHistory();this.history.push(memento);}publicTextMementopop(){returnthis.history.pop();}privatevoidlimitHistory(){if(history.size()MAX_SIZE){history.removeFirst();}}}测试publicclassClient{staticvoidmain(){// 创建Stringcontent备忘录模式笔记;TextEditortextEditornewTextEditor(content);printInfo(textEditor);CaretakercaretakernewCaretaker();// 安全考虑TextMemento是包访问权限和TextEditor同包其它地方无法直接创建// new TextMemento(); 会报错// 保存1caretaker.push(textEditor.createMemento());content包括三个角色分别是原发器;textEditor.setContent(content);caretaker.push(textEditor.createMemento());printInfo(textEditor);// 保存2content、备忘录;textEditor.setContent(content);caretaker.push(textEditor.createMemento());printInfo(textEditor);// 保存3content和管理者;textEditor.setContent(content);caretaker.push(textEditor.createMemento());printInfo(textEditor);// 编辑content 功能分别是;textEditor.setContent(content);printInfo(textEditor);// 撤销1System.out.println(撤销);textEditor.restoreMemento(caretaker.pop());printInfo(textEditor);// 撤销2System.out.println(撤销);textEditor.restoreMemento(caretaker.pop());printInfo(textEditor);}privatestaticvoidprintInfo(TextEditortextEditor){System.out.println(当前内容: textEditor.getContent());}}输出当前内容: 备忘录模式笔记 当前内容: 备忘录模式笔记包括三个角色分别是原发器 当前内容: 备忘录模式笔记包括三个角色分别是原发器、备忘录 当前内容: 备忘录模式笔记包括三个角色分别是原发器、备忘录和管理者 当前内容: 备忘录模式笔记包括三个角色分别是原发器、备忘录和管理者 功能分别是 撤销 当前内容: 备忘录模式笔记包括三个角色分别是原发器、备忘录和管理者 撤销 当前内容: 备忘录模式笔记包括三个角色分别是原发器、备忘录