备忘录模式通过发起人自主快照、备忘录不可变封装、管理者纯中转实现状态安全保存与恢复:发起人深拷贝私有状态并封装为只读备忘录,备忘录字段私有且提供安全访问,管理者仅存储不解析。

Java 中备忘录模式通过“发起人自己快照 + 备忘录只读封装 + 管理者纯中转”三步完成状态保存与恢复,核心是不暴露内部字段、不依赖外部读写。
发起人(Originator)负责状态的主动存取
发起人持有真实业务状态,必须亲自控制快照时机和恢复逻辑:
- 在状态变更前调用 saveToMemento(),内部执行深拷贝(如 new EditorMemento(content, cursorPos)),生成一个完整、独立的状态副本
- 提供 restoreFromMemento(memento) 方法,仅从备忘录中提取值并赋给自身字段,不暴露字段名、不开放 setter
- 所有状态字段保持 private,不提供 public getter/setter 给外部访问
备忘录(Memento)必须真正不可变且不可见
它不是数据容器,而是封闭的快照凭证:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 字段全部声明为 private final,构造仅限发起人包内或友元调用(如 package-private 构造函数)
- 对外只提供安全的获取方法(如 getContent()),且返回值是不可变类型(String、Collections.unmodifiableList)或新副本
- 禁止管理者或其他类直接 new Memento() 或修改其内容——否则快照失去可信性
管理者(Caretaker)只做存取不碰状态
它像一个带索引的保险箱,完全不理解状态含义:
- 用栈(Stack
)或列表(List )保存多个备忘录,支持多步撤销 - 只提供 push(memento) 和 pop(),或按索引 get(i),绝不调用 memento.getState() 或检查字段
- 不序列化、不压缩、不校验有效性——所有状态合法性判断和一致性保障都在发起人内部完成
恢复时注意变量粒度与关联性
一次 restore 必须还原强相关的整组状态,避免半截回滚导致错乱:
- 文本编辑器要同时保存 content、cursorPos、selectionRange,不能只存内容
- 游戏角色需打包 hp、mp、position、cooldowns,而不是单独存血量
- 若存在计算关系(如 totalPrice = unitPrice × quantity),应保存原始字段,而非计算结果
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










