设计模式学习(21) 23-19 备忘录模式
文章目录0. 个人感悟1. 概念2. 适配场景2.1 适合的场景2.2 常见场景举例3. 实现方法3.1 实现思路3.2 UML类图3.3 代码示例4. 优缺点4.1 优点4.2 缺点5. 源码分析5.1 Java Swing中的UndoManager0. 个人感悟备忘录模式的场景也比较专。适合进行备份、恢复模式优点很明显状态保存于业务逻辑分离实现解耦一个注意的点是窄接口设计Memento(备忘录)内部保存了Originator原发器的状态但这个状态不应该被除了Originator之外的其他对象特别是Caretaker直接访问或修改以保护状态的封装性。具体可以看看示例代码1. 概念英文定义(《设计模式可复用面向对象软件的基础》)Without violating encapsulation, capture and externalize an object,t internal state so that the object can be restored this state later.中文翻译在不破坏封装性的前提下捕获一个对象的内部状态并在该对象之外保存这个状态以便以后可以将对象恢复到原先保存的状态。理解备忘录模式提供了一种状态恢复机制允许对象回到某个历史状态它通过独立的对象备忘录来存储状态而不是由原对象自己保存实现了状态保存与业务逻辑的分离原对象专注于业务管理者专注于状态管理2. 适配场景2.1 适合的场景需要撤销/重做功能如文本编辑器、绘图软件的操作历史需要保存快照/检查点如游戏存档、系统配置备份状态转换复杂如工作流引擎的状态管理需要事务回滚如数据库操作的事务管理原型状态保存如复杂对象构造过程中的中间状态保存需要版本控制如文档编辑的历史版本管理2.2 常见场景举例IDE开发环境Eclipse/IntelliJ IDEA的代码编辑撤销功能绘图软件Photoshop的历史记录面板游戏开发游戏进度存档/读档系统表单应用多步表单的回退功能配置管理系统配置的备份与恢复数据库系统事务的rollback机制3. 实现方法3.1 实现思路识别状态数据确定需要保存的内部状态字段创建Memento类设计存储状态的数据结构在Originator中添加状态管理创建保存状态的方法saveToMemento()创建恢复状态的方法restoreFromMemento()设计Caretaker类决定存储策略栈、列表、树等实现状态管理逻辑撤销、重做、清空等控制访问权限对Originator开放宽接口可读写状态对Caretaker开放窄接口只读元数据3.2 UML类图角色说明Originator原发器需要保存状态的对象负责创建和恢复备忘录Memento备忘录存储Originator内部状态通常设计为不可变对象Caretaker管理者负责保存和管理备忘录但不能操作备忘录内容3.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());}}输出当前内容: 备忘录模式笔记 当前内容: 备忘录模式笔记包括三个角色分别是原发器 当前内容: 备忘录模式笔记包括三个角色分别是原发器、备忘录 当前内容: 备忘录模式笔记包括三个角色分别是原发器、备忘录和管理者 当前内容: 备忘录模式笔记包括三个角色分别是原发器、备忘录和管理者 功能分别是 撤销 当前内容: 备忘录模式笔记包括三个角色分别是原发器、备忘录和管理者 撤销 当前内容: 备忘录模式笔记包括三个角色分别是原发器、备忘录4. 优缺点4.1 优点高内聚低耦合职责分离状态保存与业务逻辑解耦Originator只关注核心功能封装性通过窄接口模式保护状态不被Caretaker误操作复用性状态管理可复用Caretaker可被多个Originator复用存储策略灵活支持栈、列表、数据库等多种存储方式可读性意图明确代码明确表达了保存状态和恢复状态的意图结构清晰三个角色分工明确易于理解维护性易于扩展可轻松添加新的存储策略或状态类型修改隔离状态存储逻辑变化不影响Originator稳定性状态一致确保状态恢复的正确性异常安全状态操作失败时可恢复到之前状态4.2 缺点资源消耗内存占用大量状态保存可能导致内存消耗过大性能开销频繁的状态保存/恢复可能影响性能设计复杂度额外类增加了Memento和Caretaker类窄接口实现复杂需要小心设计访问权限状态同步深拷贝问题复杂对象的深拷贝可能实现复杂版本兼容状态数据结构变化时旧备忘录可能无法恢复5. 源码分析5.1 Java Swing中的UndoManager代码位置javax.swing.undo.UndoManager角色分析// Originator各种Document类如PlainDocumentpublicclassPlainDocumentextendsAbstractDocument{// 创建UndoableEdit备忘录protectedUndoableEditcreateUndoableEdit(ElementChangeec){returnnewDocumentUndoableEdit(ec);}}// MementoUndoableEdit接口及其实现publicinterfaceUndoableEdit{voidundo()throwsCannotUndoException;voidredo()throwsCannotRedoException;booleancanUndo();booleancanRedo();}// CaretakerUndoManager类publicclassUndoManagerextendsCompoundEditimplementsUndoableEditListener{privateVectorUndoableEditedits;// 存储备忘录privateintindexOfNextAdd;// 下一个添加位置publicvoidundo()throwsCannotUndoException{// 执行撤销操作UndoableEditeditedits.elementAt(--indexOfNextAdd);edit.undo();}publicvoidredo()throwsCannotRedoException{// 执行重做操作UndoableEditeditedits.elementAt(indexOfNextAdd);edit.redo();indexOfNextAdd;}}参考:韩顺平 Java设计模式归思君 设计模式学习笔记十八备忘录模式及其实现kosamino 设计模式之备忘录模式Memento详解及代码示例

相关新闻

亲测好用MBA必看TOP8AI论文平台测评

亲测好用MBA必看TOP8AI论文平台测评

亲测好用MBA必看TOP8AI论文平台测评 2026年MBA必备AI论文平台测评:为何需要这份榜单? 随着人工智能技术的不断进步,AI写作工具在学术研究中的应用日益广泛。对于MBA学生而言,撰写高质量的论文不仅是学业要求,更是展示专…

2026/7/8 4:28:58 阅读更多 →
Deepoc具身模型开发板:智能采摘机器人的技术突破与产业实践

Deepoc具身模型开发板:智能采摘机器人的技术突破与产业实践

在智慧农业快速发展的背景下,传统农业采摘环节面临劳动力短缺、作业效率低、采摘质量不稳定等现实挑战。Deepoc具身模型开发板通过创新的技术架构和产业化路径,为智能采摘机器人提供了核心驱动力,实现了从传统人工采摘向智能化精准作业的重要…

2026/7/7 22:38:46 阅读更多 →
智能门禁让宿舍管理告别传统模式,学生归寝动态一目了然

智能门禁让宿舍管理告别传统模式,学生归寝动态一目了然

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

2026/7/6 22:22:39 阅读更多 →

最新新闻

从字节“期权激励“到阿里“3.25“:大厂绩效变局下,普通人如何靠AI智能体提升赚钱能力?

从字节“期权激励“到阿里“3.25“:大厂绩效变局下,普通人如何靠AI智能体提升赚钱能力?

导语 2025年至2026年,互联网大厂的绩效与激励体系正在经历一场深刻的变革。从字节跳动将"字节范"与"领导力原则"深度绑定绩效、大幅提升期权/RSU在半年激励中的比重,到阿里巴巴经典的"3.25"绩效制度改革,大厂…

2026/7/9 2:32:06 阅读更多 →
LangSmith | LangChain / LangGraph Agent 全链路追踪

LangSmith | LangChain / LangGraph Agent 全链路追踪

最近一段时间学习及制作Agent,但在向量库检索、Prompt 拼接、工具调用、多轮记忆读写、多层 LLM 嵌套;运行后总会出现幻觉、回答跑偏、响应超时、Token 成本暴增,却完全无法定位根源。 传统打印日志只能零散输出片段,断点调试无法复现 LLM 非…

2026/7/9 2:32:06 阅读更多 →
Hermes Agent cron 27 个实战任务调度拆解 \(按 7 大类 \+ 错峰 5min 实战\)

Hermes Agent cron 27 个实战任务调度拆解 \(按 7 大类 \+ 错峰 5min 实战\)

适用读者: 用 Hermes Agent / Claude Code / 任何 AI 助手搭生产级 cron 自动化的独立开发者 关键词: Hermes Agent / cron / 任务调度 / 错峰 / 监控 / Supabase / 飞书 / 微信公众号 一、为什么 27 个 cron 是 Hermes Agent 产线 作者用 Hermes Agent 搭个人 AI 助手 1 个月…

2026/7/9 2:32:06 阅读更多 →
通达信最佳买卖点指标

通达信最佳买卖点指标

AA05:MA(C,5),COLOR0099CC;五日乖离率:(C-AA05)/AA05*100; BB05:ATAN((AA05/REF(AA05,1)-1)*100)*180/3.1416; 速度5:SMA(EMA((AA05-REF(AA05,1))/REF(AA05,1),3)*100,3,1); 加速度5:EMA((速度5-REF(速度5,1)),3),LINETHICK0; STICKLINE(BB05>30 AND AA05>REF(AA05,1), A…

2026/7/9 2:30:04 阅读更多 →
AI智能体如何变革材料发现:从预测到全流程自动化

AI智能体如何变革材料发现:从预测到全流程自动化

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 这类AI智能体最值得关注的不是它能预测多少种材料,而是它把传统材料发现中“文献调研-理论预测-实验验证”这个漫长流程&a…

2026/7/9 2:30:04 阅读更多 →
总结 7。8

总结 7。8

今天学了数学的傅里叶级数,了解了对周期函数,并且具有有限的第一类间断点,和有限的极值点有傅里叶级数存在。对于余弦级数,补偶函数,然后剩cos,注意cosn派x/l为零到派的定积分为零。然后cosn派表示&#xf…

2026/7/9 2:30:04 阅读更多 →

日新闻

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource 还在为Foobar2000找不到高质…

2026/7/9 0:01:04 阅读更多 →
ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍 【免费下载链接】ElegantBook Elegant LaTeX Template for Books 项目地址: https://gitcode.com/gh_mirrors/el/ElegantBook 你是否曾经为学术书籍的封面设计而烦恼?想要一个既专业又美观的封…

2026/7/9 0:03:06 阅读更多 →
如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南 【免费下载链接】pyodbc Python ODBC bridge 项目地址: https://gitcode.com/gh_mirrors/py/pyodbc 在当今数据驱动的商业环境中,企业级数据库连接已成为现代应用开发的核心需求。pyodbc作为一款强大…

2026/7/9 0:07:11 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/8 16:59:55 阅读更多 →

月新闻