当前位置: 首页 > news >正文

备忘录设计模式

备忘录模式(Memento Pattern)是一种行为设计模式,用于捕获对象的内部状态并在需要时恢复该状态,同时不破坏对象的封装性。它适用于需要实现撤销/重做、历史记录或状态快照的场景。

核心组件
  1. Originator(原发器)

    • 需要保存状态的对象
    • 提供创建备忘录和恢复状态的方法
    • 示例代码:
      public class TextEditor {private String content;public void write(String text) {this.content = text;}// 创建备忘录public TextMemento save() {return new TextMemento(content);}// 从备忘录恢复public void restore(TextMemento memento) {this.content = memento.getSavedContent();}
      }
      

  2. Memento(备忘录)

    • 存储 Originator 的内部状态
    • 通常设计为不可变对象
    • 示例代码:
      public final class TextMemento {private final String content;public TextMemento(String content) {this.content = content;}// 仅允许原发器访问String getSavedContent() {return content;}
      }
      

  3. Caretaker(管理者)

    • 负责保存和管理备忘录
    • 不能修改备忘录内容
    • 示例代码:
      import java.util.Stack;public class History {private final Stack<TextMemento> states = new Stack<>();public void saveState(TextMemento state) {states.push(state);}public TextMemento getLastState() {return states.pop();}
      }
      

工作流程
graph LRA[Originator] -- 创建 --> B[Memento]B -- 存储 --> C[Caretaker]C -- 提供 --> AA -- 恢复状态 --> B

关键特性
  1. 封装保护

    • Memento 通过私有访问控制保护状态
    • Caretaker 只能存储备忘录,不能修改内容
  2. 状态管理

    • 支持多级撤销:使用栈结构存储历史状态
    • 状态隔离:每个备忘录独立存储对象快照
  3. 内存优化

    • 增量存储:仅保存变化部分
    • 懒加载:需要时再生成备忘录
适用场景
  • 需要实现撤销/重做功能(如文本编辑器)
  • 需要保存对象历史状态(如游戏存档)
  • 需要隔离状态生成和存储逻辑
优缺点分析

优点

  • 保持对象封装边界
  • 简化原发器职责(SRP原则)
  • 支持多状态管理

缺点

  • 可能增加内存消耗
  • Caretaker 需维护生命周期
  • 频繁保存可能影响性能
扩展实现
// 客户端使用示例
public class Client {public static void main(String[] args) {TextEditor editor = new TextEditor();History history = new History();editor.write("First draft");history.saveState(editor.save());  // 保存状态1editor.write("Revised content");history.saveState(editor.save());  // 保存状态2editor.restore(history.getLastState()); // 撤销到状态1}
}

设计建议

  1. 对大型对象使用增量备忘录
  2. 通过接口约束备忘录访问权限
  3. 结合原型模式优化状态克隆性能
  4. 使用对象池管理频繁创建的备忘录
http://www.dtcms.com/a/280662.html

相关文章:

  • asyncio 与 uvloop
  • 策略设计模式分析
  • 如何将华为文件传输到电脑
  • Linux的用户和用户组与权限解析、环境变量说明与配置、sudo配置解析和使用
  • HarmonyOS从入门到精通:自定义组件开发指南(七):自定义事件与回调
  • 涨停板池,跌停板池,炸板池,次新股池,强势股池数据接口
  • 单臂路由实现VLAN互通实验
  • e签宝电子合同成为白象食品数字化转型中的关键一环
  • PostgreSQL 超详细安装与使用教程:从入门到实战
  • 深入剖析 React Server Components:原理、应用与性能优势
  • 设计模式一: 模板方法模式 (Template Method Pattern)
  • Nexus 私服管理工具
  • 李宏毅《生成式人工智能导论》 | 第11讲-第14讲:大型语言模型的可解释性、能力评估、安全性
  • 20250715问答课题-基于BERT与混合检索问答系统
  • 电商缓存强一致方案:数据库锁保障
  • 设计模式开篇:设计模式的七大核心原则
  • kube-proxy 中 IPVS 与 iptables
  • PyTorch笔记7----------计算机视觉基础
  • OpenCV 伽马校正函数gammaCorrection()
  • MODIS_Landsat_Sentinel2星源分幅简述【20250715】
  • 视频编码中熵编码之基于上下文的变长编码(Huffman霍夫曼编码和指数哥伦布)
  • 【YOLOv11-目标检测】06-模型部署(C++)
  • 06_pt-table-sync 工具解决 MySQL 主从数据不一致
  • conda环境保存(后期再来整理)
  • etcd自动压缩清理
  • 2-Nodejs运行JS代码
  • iOS高级开发工程师面试——Swift
  • Fiddler 中文版抓包实战 构建标准化调试流程提升团队协作效率
  • echarts 绘制3D中国地图
  • React强大且灵活hooks库——ahooks入门实践之开发调试类hook(dev)详解