**备忘录模式(Memento Pattern)**是一种行为设计模式,它的主要目的是在不破坏对象的封装性的前提下,捕获并存储一个对象的内部状态,以便在将来需要时恢复该对象到之前的状态。这种模式非常适合需要实现撤销操作或状态恢复的场景,比如文本编辑器的撤销功能、游戏中的存档与读档功能等。
模式的主要参与者包括:
- Originator(发起人):创建并维护内部状态的对象,它定义了哪些状态需要被保存在备忘录中,同时提供了创建和恢复备忘录的方法。
- Memento(备忘录):用于存储Originator对象的内部状态。备忘录类通常会有两个接口,一个窄接口供发起人以外的类访问(只暴露有限的信息,保持封装性),另一个宽接口供发起人访问(可以访问所有保存的信息,以便恢复状态)。
- Caretaker(管理者/守护者):不直接访问备忘录的内容,只是负责存储和提供备忘录。它不关心备忘录的具体内容,只负责传递备忘录对象。
应用场景:
- 需要提供"撤销/重做"功能的场合,如文本编辑器、图形编辑软件。
- 需要保存和恢复状态的场景,如游戏进度保存和加载。
- 任何需要维护对象历史状态,以便在需要时可以恢复到过去状态的情况。
优点:
- 提高灵活性:对象可以在不影响其正常职责的情况下,将状态恢复到历史状态。
- 简化原对象:原对象不需要关心状态的存储细节,这些被转移到备忘录对象中处理。
- 封装性:备忘录对象存储了发起人的内部状态,但是限制了外界对这些状态的直接访问,只暴露有限的必要接口。
缺点:
- 资源消耗:如果需要保存的状态较为复杂或频繁,可能会占用较多的存储空间。
- 设计复杂度增加:引入了更多的类和对象,增加了系统的复杂性。
示例代码(Java):
以下是使用Java语言实现备忘录模式的一个简单示例。在这个例子中,我们定义了一个简单的文本编辑器TextEditor
作为发起人(Originator),它能够保存和恢复文本状态。TextState
代表文本的状态信息,而TextMemento
则作为备忘录,用于存储和恢复TextEditor
的状态。
1. 状态类(TextState)
java
public class TextState {
private String content;
public TextState(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
2. 发起人类(TextEditor - Originator)
java
public class TextEditor {
private TextState currentState;
public void type(String text) {
System.out.println("Typing: " + text);
currentState = new TextState(currentState != null ? currentState.getContent() + text : text);
}
public TextMemento save() {
return new TextMemento(currentState);
}
public void restore(TextMemento memento) {
currentState = memento.getState();
System.out.println("Restored state to: " + currentState.getContent());
}
}
3. 备忘录类(TextMemento)
java
public class TextMemento {
private final TextState state;
public TextMemento(TextState state) {
this.state = state;
}
public TextState getState() {
return state;
}
}
4. 管理者类(Caretaker - 可选,在此示例中未单独实现,直接在客户端代码中使用)
5. 客户端代码
java
public class MementoPatternDemo {
public static void main(String[] args) {
TextEditor editor = new TextEditor();
editor.type("Hello, ");
TextMemento memento1 = editor.save();
editor.type("how are you?");
System.out.println("Current text: " + editor.currentState.getContent());
// 模拟撤销操作
editor.restore(memento1);
}
}
在这个示例中,TextEditor
作为发起人,负责创建和恢复文本的状态;TextState
是内部状态类,保存文本的具体内容;TextMemento
作为备忘录,用于存储某个时刻的TextState
对象。客户端代码中,我们创建了一个文本编辑器实例,输入了一些文本,保存了一个状态,继续输入后模拟了撤销操作,恢复到了之前保存的状态。这展示了备忘录模式如何帮助我们实现状态的保存和恢复功能。