一、简介
备忘录模式(Memento Pattern)是一种行为设计模式,旨在捕获一个对象的内部状态,并在不破坏对象封装的前提下将其保存,以便稍后可以恢复到先前的状态。
备忘录模式指的是在不破坏封装性的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,从而在需要时能将对象恢复到先前的状态。这种模式涉及三个主要角色:原发器(Originator)、备忘录(Memento)和管理者(Caretaker)。
- 原发器(Originator):负责创建一个备忘录,并记录当前状态到备忘录对象,也可以从备忘录对象中恢复状态。
- 备忘录(Memento):用于存储原发器对象的内部状态。备忘录可以记录原发器对象的部分或全部状态。
- 管理者(Caretaker):负责存储备忘录对象,但不能对备忘录的内容进行操作,只能够将备忘录传递给其他对象。
备忘录模式允许在不暴露对象实现细节的情况下保存和恢复对象的状态,提供了一种方便的方式来回滚对象的状态到先前的状态,以支持撤销和恢复等操作。
二、备忘录模式
当涉及到备忘录模式时,一个经典的案例是文本编辑器中的撤销(Undo)和恢复(Redo)功能。我们先创建一个简单的文本编辑器示例,展示如何使用备忘录模式实现撤销和恢复功能:
2.1、备忘录
// 备忘录:用于保存文本编辑器的状态
public class TextEditorMemento {
private final String content;
public TextEditorMemento(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
2.2、原发器
import java.util.Stack;
// 原发器:文本编辑器
public class TextEditor {
private String content;
private final Stack<TextEditorMemento> history;
public TextEditor() {
this.content = "";
this.history = new Stack<>();
}
public void write(String text) {
saveState();
content += text;
}
public void undo() {
if (!history.isEmpty()) {
content = history.pop().getContent();
}
}
private void saveState() {
history.push(new TextEditorMemento(content));
}
public void printContent() {
System.out.println("当前内容: " + content);
}
}
2.3、备忘录模式
// 测试类
public class MementoPatternExample {
public static void main(String[] args) {
TextEditor editor = new TextEditor();
editor.write("Hello ");
editor.write("GoLang!");
editor.printContent(); // 输出:当前内容: Hello GoLang!
editor.undo();
editor.printContent(); // 输出:当前内容: Hello
}
}
运行结果:
当前内容: Hello GoLang!
当前内容: Hello
三、优点与缺点
备忘录模式具有以下优点和缺点:
优点
- 封装性良好: 备忘录模式可以在不破坏对象封装性的前提下,捕获和保存对象的状态,对客户端隐藏了对象的实现细节。
- 状态保存与恢复: 允许在需要时将对象状态保存到备忘录中,并在之后将对象恢复到先前的状态,支持撤销和恢复操作。
- 简化原发器类: 备忘录模式可以使得原发器类的代码更加简洁,将状态保存和恢复的责任分离出去。
缺点
- 资源消耗: 当需要频繁保存状态时,会消耗一定的内存资源,尤其是当状态对象非常大或者对象频繁变动时。
- 潜在性能问题: 保存大量状态信息可能会影响性能,特别是当备忘录对象的管理成本增加时。
- 不适合大规模对象: 对于大规模的对象,保存和管理其多个状态可能会变得复杂和低效。
总的来说,备忘录模式适用于需要保存和恢复对象状态、支持撤销和恢复操作的场景。它提供了一种简单、清晰的方式来管理对象状态,但需要权衡资源消耗和性能问题。通常在需要保存状态快照以支持撤销操作的情况下才会使用备忘录模式。