备忘录模式是面向程序开发的、用于保存和还原对象内部状态的设计模式,核心是在不破坏封装前提下实现状态快照与精准恢复,通过originator、memento、caretaker三者职责分离保障安全性与不可变性。

备忘录模式(Memento Pattern)不是用来“备份硬盘文件”或“恢复误删文档”的,而是面向程序开发的、用于保存和还原对象内部状态的设计模式。它解决的是:如何在不破坏封装的前提下,把一个对象的某个时刻状态存下来,并在需要时精准还原——比如撤销编辑、回滚配置、实现多级历史版本等。
核心原则:隔离状态与行为
对象本身(Originator)负责创建和使用状态,但不直接暴露内部数据;备忘录(Memento)只存储快照,且对外不可修改;管理者(Caretaker)负责保管备忘录,但不能访问其内容。三者职责分明,确保封装性不被破坏。
- Originator 内部定义 createMemento() 生成备忘录,restoreFromMemento(m) 从备忘录恢复
- Memento 类通常设为 Originator 的私有内部类,或通过接口限制外部读写权限
- Caretaker 只调用 save() / restore(),完全不知道备忘录里存了什么
安全备份的关键细节
真正“安全”,在于防止状态泄露和意外篡改:
- 备忘录对象应为不可变(immutable):构造后所有字段 final,不提供 setter 方法
- 避免序列化敏感字段:如密码、令牌、临时句柄等,应在 createMemento() 中主动过滤或脱敏
- 若需持久化存储(如存入数据库或文件),应对备忘录内容加密,而非直接存原始对象字节流
- 建议为每个备忘录附加时间戳和简短描述(如“用户提交表单前”),便于后续识别
按时间点恢复的典型实现
要支持“恢复到某时刻”,不能只保存一个状态,而需维护一个有序的历史栈或列表:
- 用 ArrayList
或 Stack 管理多个备忘录,按生成时间顺序追加 - 提供 getMementoAt(timestamp) 方法,通过二分查找快速定位最接近该时间的备忘录
- 恢复时先校验备忘录有效性(如检查时间是否在有效窗口内、是否已被清理),再调用 restoreFromMemento()
- 可配合版本号或哈希值做一致性校验,避免因内存异常导致状态损坏却仍被还原
和系统级备份的区别
别混淆备忘录模式与 Windows 卷影副本、SQL Server 时点还原、或 OBS 对象备份:
- 后者操作的是物理存储层或文件系统级数据,依赖操作系统或数据库引擎
- 备忘录模式纯属内存中对象状态的逻辑快照,不涉及磁盘 I/O、事务日志或 VSS 服务
- 它不保证崩溃后存活——进程退出,内存清空,备忘录即丢失;如需持久化,必须额外集成文件/DB 存储逻辑











