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

什么是备忘录模式?一文详解

目录一.备忘录模式Memento Pattern意图1.角色划分2.精髓思想二.最简单的案例文本编辑器的撤销功能1.代码三.为什么要这样设计一.备忘录模式Memento Pattern意图在不暴露对象实现细节的前提下捕获并外部化一个对象的内部状态以便在后续需要时能够将该对象恢复到原先保存的状态。1.角色划分①原发器也叫编辑器Originator文本编辑器本身能创建备忘录保存当前内容为一个备忘录版本和从备忘录恢复撤销到上一个备忘录版本②备忘录Memento被保存的对象只允许原发器访问③负责人Caretaker用于存放原发器也叫编辑器保存好的备忘录版本仅存而不能改2.精髓思想拿我们在txt文本文档写文字时的场景举例当我们新写了两个字以后这两个字是停留在原发器也叫编辑器因为原发器也叫编辑器是用来存放暂时的内容的。当我们的原发器也叫编辑器调用了save保存方法该方法会创建一个备忘录对象即一个备忘录版本然后我们需要调用负责人的save保存方法传入上一步那个备忘录对象。就表示“你刚刚在原发器也叫编辑器保存的版本已经被负责人存好了”此时我们可以再写三个字此时原发器也叫编辑器的暂存内容是5个字了其中2个字的版本已经被保存到负责人后3个字是新添加的但此时我们不调用原发器也叫编辑器的save(保存)方法。此时我们不想要后面三个字了怎么办说白了就是我还想重新回到那两个字的版本。此时就需要从负责人中取出之前保存好的备忘录版本并将该备忘录的内容重新赋值给原发器也叫编辑器的内容这个内容在本案例中就是一个String属性说白了就是输入的文字此时原发器也叫编辑器的暂存内容就从5个字被覆盖到2个字了说白了就完成了撤销到上个版本的终极目标。思考备忘录模式保存的具体内容一定是String吗答案不一定。只是本案例举的是txt文本文档的例子其实可以是任何东西比如List、Stack等等。无论保存的是啥总体的思想100%不会变。说白了保存的具体内容不重要备忘录模式的重点是如何完成保存、撤销这两个动作这是终极奥义二.最简单的案例文本编辑器的撤销功能假设我们有一个简单的文本编辑器需要支持 保存状态 和 撤销到上一个状态 的功能。1.代码// 1. 备忘录保存文本状态 class TextMemento { private final String text; // 文本内容 // 构造方法私有只有原发器能创建 TextMemento(String text) { this.text text; } // 只允许原发器获取状态 String getText() { return text; } } // 2. 原发器文本编辑器 class TextEditor { //这是目前暂存的内容 private String text ; // 给暂存内容追加文本 public void type(String words) { text words; } // 保存当前状态到备忘录根据暂存内容生成一个备忘录版本要传给负责人保存起来 public TextMemento save() { return new TextMemento(text); } // 从备忘录恢复状态根据负责人保存的备忘录版本覆盖当前编辑器的暂存内容说白了就是撤销 public void restore(TextMemento memento) { this.text memento.getText(); } // 显示当前暂存内容 public String getText() { return text; } } // 3. 负责人管理备忘录这里简单用一个变量保存最近的状态 class Caretaker { //这是已经保存的备忘录版本 private TextMemento lastMemento; //保存编辑器即原发器传来的备忘录版本 public void saveMemento(TextMemento memento) { lastMemento memento; } //获取已经保存的备忘录版本常用于覆盖编辑器内容这个动作也叫撤销 public TextMemento getLastMemento() { return lastMemento; } } // 测试代码 public class Main { public static void main(String[] args) { TextEditor editor new TextEditor(); Caretaker caretaker new Caretaker(); // 在编辑器原发器输入一些内容 editor.type(Hello );//说白了此时编辑器暂存内容为“Hello ” // 将编辑器原发器的暂存内容保存为一个备忘录版本然后将该备忘录版本传入负责人中进行保存 caretaker.saveMemento(editor.save()); // 存档1: Hello // 再追加点文本 editor.type(World!);//说白了此时编辑器暂存内容为“Hello World!”但是没保存 System.out.println(当前文本: editor.getText()); // 输出: Hello World! // 撤销到上一次保存的状态从负责人中取出保存的备忘录版本即“Hello ”的那一版并根据这一版内容是“Hello ”,覆盖编辑器的暂存内容说白了就是撤销 editor.restore(caretaker.getLastMemento());//此时暂存内容会从“Hello World!”撤销被覆盖为“Hello ” System.out.println(撤销后文本: editor.getText()); // 输出: Hello } }三.为什么要这样设计原发器也叫“编辑器”Originator的内部状态text 变量被保护起来只有它自己能修改备忘录TextMemento像个 密封的盒子只有原发器能打开负责人Caretaker只负责 保管盒子不能看里面的内容这个模式在需要频繁撤销操作的场景非常有用比如文本编辑器的撤销 / 重做游戏存档 / 读档数据库事务回滚以上就是本篇文章的全部内容喜欢的话可以留个免费的关注呦~~~
http://www.gsyq.cn/news/1330922.html

相关文章:

  • 哪个牌子的 pos 刷卡机靠谱?个人自用机正规机构扫码刷卡避坑指南 - 资讯速览
  • 告别Eclipse插件!在Maven项目中用antlr4-maven-plugin自动生成解析器代码(附完整pom.xml配置)
  • NetCoMi微生物网络分析:从数据到洞察的完整解决方案
  • 告别手动录入!用JavaScript+SQL实现泛微E9明细表数据自动填充(附完整代码)
  • 从AIGC到AIGS:Java团队的AI落地之路
  • PhantomJS+jsEncrypter插件:手把手教你打造BurpSuite专属密码加密爆破模块
  • FunASR与HuggingFace无缝对接:5分钟搞定跨平台语音识别部署
  • Linux more 命令详解:从基础分页到高级文本查看技巧
  • MATLAB文件选择对话框uigetfile()保姆级教程:从单文件到多选的完整配置流程
  • Sora 2时间轴与Blender NLA编辑器深度对齐指南(2024.06.12 Blender官方补丁前最后兼容方案)
  • FunASR工业级应用案例:金融客服语音分析系统
  • 医疗器械厂家可以定制中频治疗仪款式吗 - 舒雯文化
  • 三星固件下载终极指南:Bifrost跨平台工具免费获取官方系统
  • 从一次gRPC连接失败,聊聊Go语言中net.Listen(‘tcp‘, ‘127.0.0.1:9001‘)背后的网络编程哲学
  • 告别马赛克!用SPIN超像素Transformer,5分钟看懂轻量级图像超分新玩法
  • 哪个牌子的 pos 刷卡机靠谱?个人刷卡机正规机构大额刷卡,无年费对比测评 - 资讯速览
  • CANN/asc-devkit核间同步API文档
  • 2026 在线水印去除工具怎么选?6款实用方法对比测评
  • 2026开窗包装盒厂家推荐:大健康定制领域标杆企业测评 - 资讯速览
  • CubeCL 核心架构揭秘:基于立方体拓扑的跨平台计算模型
  • 深入理解DocQuery架构:LayoutLM模型与零样本学习原理
  • 2026年去水印工具推荐:6大免费去水印工具详测,这款处理速度快到离谱 - 科技热点发布
  • 2026年管棒材检测系统十强厂商最新深度评测
  • Codex SQL迁移终极指南:数据库架构变更的自动化革命
  • 从零实现工业级PID控制器:C语言实战与参数调试避坑指南
  • 5分钟掌握Windows实时屏幕翻译神器:Translumo完整指南
  • 从账单明细看taotoken按token计费模式的清晰度与灵活性
  • CANN/asc-devkit非连续对齐搬入API
  • Oryx 2实时推荐系统实战:基于ALS的协同过滤完整解决方案 [特殊字符]
  • 第4篇:Skill的提示词设计精要——让AI精准理解意图