【设计模式】备忘录模式(Memento)详解:在不破坏封装的前提下保存对象状态

文章目录

    • 1. 引言:为什么“撤销”这么难?
    • 2. 什么是备忘录模式
      • GoF 定义
    • 3. 备忘录模式的核心思想
    • 4. 备忘录模式的结构
    • 5. 示例:文本编辑器撤销功能
      • 5.1 备忘录类(不可变)
      • 5.2 发起人
      • 5.3 管理者
      • 5.4 客户端使用
    • 6. 备忘录模式的优点
    • 7. 备忘录模式的缺点
    • 8. 备忘录 vs 命令
    • 9. 备忘录 vs 状态模式
    • 10. JDK / 框架中的备忘录思想
      • 数据库事务
    • 11. 适用场景
    • 12. 一个常见误区
    • 参考

1. 引言:为什么“撤销”这么难?

在日常软件中,“撤销 / 回滚”几乎无处不在:

  • 编辑器的 Ctrl + Z
  • 游戏存档
  • 事务回滚
  • 配置快照

最直接的想法是:

classEditor{Stringtext;}

直接暴露字段保存?

  • 破坏封装
  • 状态越来越复杂
  • 外部对象不该知道内部细节

备忘录模式的目标:保存状态,但不暴露内部结构。

备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,很多软件都提供了撤销(Undo)操作,如 Word、记事本、Photoshop、IDEA等软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;还有在 浏览器 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋类游戏中的悔棋功能等都属于这类。


2. 什么是备忘录模式

GoF 定义

在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

详细解释:又叫快照模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。

一句话理解:

状态交给“备忘录”保存。


3. 备忘录模式的核心思想

备忘录模式解决的问题是:

  1. 如何保存对象内部状态
  2. 如何恢复历史状态
  3. 不让外部对象直接操作内部细节

状态属于对象,但保存权不属于对象自己。


4. 备忘录模式的结构

备忘录模式包含三个角色:

  1. Originator(发起人):需要保存状态的对象

记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。

  1. Memento(备忘录):状态快照

负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。

  1. Caretaker(管理者):保存备忘录,但不解析内容

对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。


5. 示例:文本编辑器撤销功能

5.1 备忘录类(不可变)

publicclassEditorMemento{privatefinalStringcontent;publicEditorMemento(Stringcontent){this.content=content;}publicStringgetContent(){returncontent;}}

5.2 发起人

publicclassEditor{privateStringcontent;publicvoidwrite(Stringtext){content=text;}publicEditorMementosave(){returnnewEditorMemento(content);}publicvoidrestore(EditorMementomemento){this.content=memento.getContent();}publicStringgetContent(){returncontent;}}

5.3 管理者

importjava.util.Stack;publicclassHistory{privateStack<EditorMemento>stack=newStack<>();publicvoidpush(EditorMementomemento){stack.push(memento);}publicEditorMementopop(){returnstack.pop();}}

5.4 客户端使用

Editoreditor=newEditor();Historyhistory=newHistory();editor.write("Hello");history.push(editor.save());editor.write("Hello World");history.push(editor.save());editor.write("Hello World!!!");editor.restore(history.pop());System.out.println(editor.getContent());

6. 备忘录模式的优点

  1. 不破坏封装
  2. 支持撤销 / 回滚
  3. 状态管理职责清晰
  4. 符合单一职责原则

7. 备忘录模式的缺点

  1. 状态快照占内存
  2. 深拷贝成本高
  3. 状态过多时管理复杂

8. 备忘录 vs 命令

维度备忘录命令
关注点状态保存行为封装
是否支持撤销
实现方式状态快照反向操作

9. 备忘录 vs 状态模式

模式解决的问题
备忘录保存历史状态
状态行为随状态变化

10. JDK / 框架中的备忘录思想

数据库事务

  • undo log
  • savepoint

本质上就是备忘录思想。


11. 适用场景

  • 编辑器
  • 游戏存档
  • 事务系统
  • 快照 / 回滚

12. 一个常见误区

备忘录不是简单的 getter/setter,而是“受控的状态快照”。


参考

备忘录模式 | 菜鸟教程

《图解设计模式》

备忘录 - Java教程 - 廖雪峰的官方网站

备忘录设计模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1178889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源存储新变局:MinIO步入维护期后的五大替代方案深度解析

开源存储新变局:MinIO步入维护期后的五大替代方案深度解析 近日,开源对象存储领域发生重要变化:MinIO官方正式宣布其开源版本进入“维护模式” 。这一变化意味着该项目将不再增加新功能,仅提供有限的安全更新和关键…

北京上门回收老酒避坑指南!选京城亚南,高价又靠谱 - 品牌排行榜单

北京老酒回收市场鱼龙混杂,很多市民变现时都踩过坑。要么是遇到无资质的黑回收,要么是被恶意压价,要么是酒品被掉包,损失惨重。今天就给大家分享一份北京上门回收老酒避坑指南,同时推荐一家靠谱的商家——京城亚南…

2025不容错过的设计感美妆品牌,全案服务商口碑TOP10,可靠的设计帕特广告显著提升服务 - 品牌推荐师

在颜值经济与品牌价值并重的时代,一个美妆品牌的成功,早已超越了产品功效本身。对于初创品牌而言,如何在激烈的市场竞争中快速建立品牌认知、塑造独特视觉形象,成为从0到1破局的关键。因此,选择一家兼具战略眼光、…

最新电梯广告品牌排行榜,谁家口碑最好?户外农村墙体/户外LED广告/社区道闸广告/公交站台广告/影院广告电梯广告价格哪个好 - 品牌推荐师

随着城市化进程的深入和社区经济的崛起,电梯广告作为“最后三米”的精准触达媒介,其商业价值日益凸显。2025年,品牌方在选择合作伙伴时,不仅关注媒体资源的广度,更看重投放策略的专业性、执行效率与最终效果。基于…

北京上门回收洋酒!轩尼诗XO、马爹利高价收,京城亚南专业鉴定 - 品牌排行榜单

很多北京家庭里都有闲置的洋酒,比如轩尼诗XO、马爹利蓝带、人头马等,大多是朋友赠送或商务往来所得,自己不喝,放着又浪费,想变现却不知道找哪家靠谱。今天给大家推荐京城亚南酒业,北京上门回收洋酒,专业鉴定,高…

小程序毕设选题推荐:基于SpringBoot+Vue的美妆购物系统小程序基于springboot+协同过滤算法的美妆护理类的购物平台小程序【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2025年盘点:附近重切削领域36款定制排刀机谁更强?4+4车铣/车铣复合/双主轴双排刀/尾顶机/直Y/数控车床/排刀机排刀机厂家选哪家 - 品牌推荐师

在精密制造领域,尤其是涉及航空航天、新能源汽车、高端液压等核心部件的加工时,“附近重切削”能力正成为衡量一台排刀机性能的关键标尺。这一工艺要求机床在狭小空间内,对高硬度、高强度的材料进行稳定、高效且高精…

Python中的 zip()和enumerate()详解

Python中的 zip 和 enumerate 详解1. enumerate() - 给可迭代对象添加索引基本用法示例实用场景2. zip() - 并行迭代多个序列基本用法示例特殊用法3. zip() 和 enumerate() 的组合使用SIFT中的经典模式分解理解其他组合用法4. 高级技巧和注意事项迭代器消耗问题内存效率对比实际…

★★★求pi的近似值

Q401.(语言: C)用下列公式求pi的近似值,直到最后一项的绝对值小于1e-4为止(最后一项要加): π/4≈1-1/3+1/5-1/7 ....... **输入:无 **输出格式要求:"pi=%10.6f\n" 程序运行示例如下: pi= 3.141793 注…

从灵感到成品:我用这 20+ 个网站,把“想法”变成能发、能用、能送人的作品

你有没有过这种瞬间: 脑海里突然闪过一个画面——像纹身闪图一样干净利落;或者突然哼出一段节拍,越想越上头;又或者你很想给某个人留下些什么,但一到键盘前就只剩下“祝你快乐”。 我后来发现,很多时候我们缺的不…

救命神器!8款AI论文工具测评:本科生毕业论文全攻略

救命神器&#xff01;8款AI论文工具测评&#xff1a;本科生毕业论文全攻略 2026年AI论文工具测评&#xff1a;为何要关注这些工具&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始依赖AI论文工具来提升写作效率、优化内容质量。然而&#xff0c;面对市…

北京上门回收陈年茅台!京城亚南高价收老款茅台,专业鉴定有保障 - 品牌排行榜单

陈年茅台是很多收藏爱好者的心头好,也是老酒回收市场的“硬通货”。但陈年茅台鉴定难度大,回收价格差异也大,很多北京市民手里有陈年茅台想变现,却不知道找哪家专业。今天就给大家推荐京城亚南酒业,北京上门回收陈…

PCTF赛后补题

冈易云音乐 手玩软件,点开第一首歌,拖动进度条过半会出现登录页面弹窗,已经自动填好用户名 ”jjkk114514“。结合题目提示,这里的 ”激活码“ 就是 flag。 进入IDA分析,进字符串页面,尝试寻找与 ”用户名“ 或 ”…

助力金融信创与云原生转型,DeepFlow 排障智能体和可观测性建设实践 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

高价回收!北京本地上门收茅台五粮液,京城亚南酒业当场结算 - 品牌排行榜单

“家里有两瓶2020年的飞天茅台,想出手能卖多少钱?”“有没有北京本地能上门回收五粮液的靠谱商家?”最近很多北京网友都在问这类问题,今天就给大家推荐一家靠谱的——京城亚南酒业,北京本地上门回收茅台、五粮液,…

三种经典的智能体设计模型

1. ReAct (Reason + Act) 核心思想: ReAct将“推理(Reasoning)”与“行动(Acting)”紧密结合,形成一个“思考-行动-观察”的循环。这个范式通过不断地进行推理和实际操作,智能体能在每个步骤后更新自己的推理,…

年底变现高峰!北京上门回收茅台五粮液,京城亚南高价不压价 - 品牌排行榜单

年底到了,很多北京市民开始清理家里的闲置物品,其中就包括不少茅台、五粮液等名酒。年底也是老酒回收的高峰期,很多商家会趁机压价,让市民蒙受损失。在这里提醒大家,年底变现选对商家很重要,京城亚南酒业北京上门…

全栈开发者用 XinServer 实现快速接口开发

全栈开发者用 XinServer 实现快速接口开发 最近跟几个做前端的朋友聊天&#xff0c;发现一个挺普遍的现象&#xff1a;大家做项目&#xff0c;最头疼的往往不是前端页面有多复杂&#xff0c;而是后端那摊子事。一提到要自己搭服务器、设计数据库、写接口、搞权限、处理运维………

软件负责人的项目管理经验

文章目录前言一、项目全周期流程管理1.1 项目启动阶段&#xff1a;夯实基础1.2 项目规划阶段&#xff1a;谋定后动1.3 项目执行与监控阶段&#xff1a;动态调整1.4 项目收尾阶段&#xff1a;闭环与升华二、多维度项目管控三、团队领导与人员管理3.1 团队构建与氛围营造3.2 人员…

北京上门回收老酒!茅台五粮液高价变现,亚南酒业全程省心 - 品牌排行榜单

北京的朋友们注意了!家里有闲置的茅台、五粮液,或是压箱底的陈年老酒、洋酒,想变现又怕麻烦?别发愁,京城亚南酒业北京全域上门回收,让你足不出户就能轻松卖高价! 很多北京市民手里都有不少闲置名酒,要么是商务…