news 2026/4/16 10:14:38

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【设计模式】备忘录模式(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教程 - 廖雪峰的官方网站

备忘录设计模式

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:14:22

Zephyr 消息队列 接口与内部实现详解

第一章 设计背景与使用场景概述1.1 Zephyr 中的 IPC 设计哲学Zephyr 作为面向嵌入式与多核 SoC 的 RTOS&#xff0c;其内核对象&#xff08;Kernel Object&#xff09;在设计上强调&#xff1a;确定性&#xff08;Determinism&#xff09;&#xff1a;操作复杂度可控&#xff0…

作者头像 李华
网站建设 2026/4/15 14:53:27

解析Cardano十一月黑客攻击事件的技术细节

Cardano的十一月黑客攻击事件解析 在十一月发生的一起针对Cardano区块链的黑客攻击中&#xff0c;其联合创始人Charles Hoskinson详细解释了事件经过。此次攻击被称为“毒交易”攻击&#xff0c;它成功地使Cardano区块链分裂成了两条链。 Hoskinson描述了攻击的核心机制以及它如…

作者头像 李华
网站建设 2026/4/12 16:47:17

程序员必看:大模型时代如何突围?从地铁求职广告看AI转型之路

大模型浪潮下&#xff0c;程序员面临前所未有的转型挑战。文章通过林默然的地铁求职案例&#xff0c;揭示了行业高门槛与人才短缺的矛盾。大模型技术正重构编程领域&#xff0c;AI编程工具广泛应用&#xff0c;可能导致部分岗位被替代&#xff0c;但也催生新职业形态。传统产品…

作者头像 李华
网站建设 2026/4/15 12:04:34

springboot的智能民宿预定与游玩系统设计与实现

背景与意义市场需求驱动 随着旅游业的快速发展&#xff0c;个性化、智能化的民宿预订需求显著增长。传统预订平台功能单一&#xff0c;缺乏个性化推荐和本地游玩整合&#xff0c;难以满足现代游客对便捷性和体验感的要求。智能民宿系统通过整合预订、游玩推荐、智能客服等功能&…

作者头像 李华
网站建设 2026/4/8 16:42:31

React Native for OpenHarmony 实战:ProgressRing 环形进度详解

React Native for OpenHarmony 实战&#xff1a;ProgressRing 环形进度详解 摘要&#xff1a;本文深度剖析React Native在OpenHarmony平台实现ProgressRing环形进度组件的完整方案。通过真实设备测试&#xff08;华为Mate 50 Pro OpenHarmony 3.2.11.5&#xff09;&#xff0…

作者头像 李华
网站建设 2026/4/12 9:35:07

从混乱到智能:机房U位资产管理系统技术架构实战指南

机房U位作为服务器、交换机等设备的核心承载空间&#xff0c;其管理精度直接决定数据中心运维效率与资源利用率。传统人工台账记录、Excel统计模式&#xff0c;常因设备移位、标注误差、信息不同步陷入管理混乱&#xff0c;不仅增加运维成本&#xff0c;更可能因故障定位滞后影…

作者头像 李华