时间:2025-02-11 22:50
人气:
作者:admin
备忘录(Memento、Snapshot)模式属于行为型模式的一种。
备忘录模式主要用于捕获一个对象的内部状态,以便在将来的某个时候恢复此状态。
备忘录模式的核心思想是将对象的状态保存在一个独立的对象中,这样既能保持对象的封装性,又能方便地恢复对象到之前的状态。
我们使用的几乎所有软件都用到了备忘录模式。大多数软件提供的保存、打开,以及编辑过程中的Undo、Redo都是备忘录模式的应用。Java的序列化也可以看作是备忘录模式。
备忘录模式适合在有撤销操作、恢复状态、对象状态追踪等场景下使用。
备忘录模式通常有以下组成部分:
如果我们使用的编程语言支持嵌套类(如Java、C++、 C# 等),则可将备忘录嵌套在Originator类中; 如果不支持(如PHP等), 那么我们可以从备忘录类中抽取一个空接口,然后让其他所有对象通过接口来引用备忘录。 我们还可以在该接口中添加一些元数据操作,但不能暴露Originator类的状态。
我们用备忘录模式实现一个简单的文本编辑器中的撤销功能。当用户输入文本时,编辑器会保存当前文本状态,这样当用户点击“撤销”按钮时,编辑器能够恢复到上一个状态。
1、Memento: 备忘录类
// Memento: 备忘录类
class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
2、Originator: 发起人类
// Originator: 发起人类
class TextEditor {
private String text;
public void setText(String text) {
this.text = text;
}
public String getText() {
return text;
}
// 创建备忘录
public Memento saveToMemento() {
return new Memento(text);
}
// 恢复状态
public void restoreFromMemento(Memento memento) {
this.text = memento.getState();
}
}
3、Caretaker: 看护者类
// Caretaker: 看护者类
class TextEditorHistory {
private List<Memento> mementoList = new ArrayList<>();
// 保存备忘录
public void addMemento(Memento memento) {
mementoList.add(memento);
}
// 获取特定索引的备忘录
public Memento getMemento(int index) {
return mementoList.get(index);
}
}
4、客户端
// 客户端代码
public class MementoPatternDemo {
public static void main(String[] args) {
TextEditor editor = new TextEditor();
TextEditorHistory history = new TextEditorHistory();
editor.setText("Hello");
history.addMemento(editor.saveToMemento()); // 保存当前状态
editor.setText("Hello, World!");
history.addMemento(editor.saveToMemento()); // 保存当前状态
editor.setText("Hello, World! How are you?");
System.out.println("Current Text: " + editor.getText());
// 恢复到上一个状态
editor.restoreFromMemento(history.getMemento(1));
System.out.println("After undo: " + editor.getText());
// 恢复到最初状态
editor.restoreFromMemento(history.getMemento(0));
System.out.println("After undo again: " + editor.getText());
}
}
备忘录模式的优缺点。
优点:
缺点:
我们可以同时使用命令模式和备忘录模式来实现 “撤销”功能。命令用于对目标对象执行各种不同的操作,备忘录用来保存一条命令执行前该对象的状态。
人生的确充满艰难险阻,但回荡不息的主旋律,是不期而遇的温暖和生生不息的希望。-- 烟沙九洲