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

设计模式2.【备忘录模式】

目录

一.Java 备忘录模式(Memento Pattern)通俗解释

二.最简单的案例:文本编辑器的撤销功能

1.角色划分

①原发器(Originator):文本编辑器本身,能创建备忘录和从备忘录恢复

②备忘录(Memento):保存编辑器的状态(只允许原发器访问)

③负责人(Caretaker):管理备忘录(但不能修改内容)

2.代码

三.为什么要这样设计?


一.Java 备忘录模式(Memento Pattern)通俗解释

备忘录模式就像生活中的 "存档" 功能:

  • 玩游戏时,你可以存档(保存当前状态)
  • 遇到危险时,能读档(恢复到之前的状态)
  • 存档不影响游戏本身,也不会暴露游戏内部细节

它主要解决:如何在不破坏封装性的前提下,捕获和恢复对象的内部状态

二.最简单的案例:文本编辑器的撤销功能

假设我们有一个简单的文本编辑器,需要支持 "保存状态" 和 "撤销到上一个状态" 的功能。

1.角色划分

①原发器(Originator):文本编辑器本身,能创建备忘录和从备忘录恢复

②备忘录(Memento):保存编辑器的状态(只允许原发器访问)

③负责人(Caretaker):管理备忘录(但不能修改内容)

2.代码

// 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 ");caretaker.saveMemento(editor.save());  // 存档1: "Hello "// 继续输入editor.type("World!");System.out.println("当前文本: " + editor.getText());  // 输出: Hello World!// 撤销到上一次保存的状态editor.restore(caretaker.getLastMemento());System.out.println("撤销后文本: " + editor.getText());  // 输出: Hello }
}

三.为什么要这样设计?

  • 编辑器(Originator)的内部状态(text 变量)被保护起来,只有它自己能修改
  • 备忘录(TextMemento)像个 "密封的盒子",只有原发器能打开
  • 负责人(Caretaker)只负责 "保管盒子",不能看里面的内容

这个模式在需要频繁撤销操作的场景非常有用,比如:

  • 文本编辑器的撤销 / 重做
  • 游戏存档 / 读档
  • 数据库事务回滚

以上就是本篇文章的全部内容,喜欢的话可以留个免费的关注呦~~~

http://www.dtcms.com/a/394044.html

相关文章:

  • Spring Boot 入门:快速构建现代 Java 应用的利器
  • Redis 实例 CPU 飙高到 90%,如何排查和解决?
  • 中国女篮备战全运会,宫鲁鸣重点培养年轻核心
  • 【Qt】常用控件1——QWidget
  • 9.21关于大模型推理未来的思考
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘uvicorn’ 问题
  • 变分自编码器(VAE):生成模型的另一条技术路线
  • 【LVS入门宝典】LVS NAT模式实战指南:ip_forward、iptables与SNAT、DNAT规则配置详解
  • 【Android】BottomSheet的三种使用
  • Spring MVC 九大组件源码深度剖析(八):RequestToViewNameTranslator - 视图名转换的奥秘
  • 在Linux环境下安装和卸载DMETL5数据迁移工具
  • 《计算》第五六章读书笔记
  • daily notes[47]
  • 模电基础:放大电路的分析方法---图解法
  • Windows10系统Web UI自动化测试学习系列1--介绍(序章-万事开头难)
  • 安装vllm的艰苦过程
  • 探索 Event 框架实战指南:微服务系统中的事件驱动通信:
  • FPGA超高速接口GTP_GTY_GTX使用说明
  • Blender常用第三方插件总结
  • Kurt-Blender零基础教程:第2章:建模篇——第3节:陈列/父子级/蒙皮/置换修改器与小狐狸角色建模
  • npm启动项目报错“无法加载文件……”
  • 从 0 到 1 精通 Nacos:服务发现与配置中心的实战指南
  • 基于DrissionPage的趣易百影院数据采集实战指南
  • github十大开源FPGA项目
  • R语言 csv新增一列 dplyr操作
  • IDEA创建Module子项目后,只有一个普通的文件夹
  • 支持向量机深度解析:从数学原理到工程实践的完整指南
  • 2025华为杯研究生数学建模竞赛B题及求解思路
  • 三星CIS全球产能布局解析:本土根基、海外扩张与策略雄心
  • js集装箱号校验算法