设计模式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)只负责 "保管盒子",不能看里面的内容
这个模式在需要频繁撤销操作的场景非常有用,比如:
- 文本编辑器的撤销 / 重做
- 游戏存档 / 读档
- 数据库事务回滚
以上就是本篇文章的全部内容,喜欢的话可以留个免费的关注呦~~~