备忘录模式(Memento Pattern)
备忘录模式是一种行为设计模式,它能在不破坏对象封装的前提下,捕获并保存对象的当前状态,以便后面可以恢复到这个状态。
概念
- 发起人(Originator):创建一个包含当前状态的备忘录,并使用备忘录恢复内部状态。
- 备忘录(Memento):存储发起人的内部状态,并防止除发起人之外的其他对象访问备忘录。
- 管理者(Caretaker):负责保存备忘录对象,但不会修改或检查备忘录的内容。
优点
- 提供了一种状态回滚的机制:允许对象回到之前的状态,适用于功能如撤销、重做等场景。
- 保存状态信息的封装性:不会破坏对象的封装边界,备忘录仅对发起人公开状态信息。
- 简化了发起人的职责:发起人不需要管理和保存其状态的历史,这些工作由备忘录和管理者负责。
缺点
- 可能会占用大量内存:如果频繁保存状态,且状态数据较大,可能会占用大量内存。
- 难以维护各个历史版本之间的依赖关系:在复杂的对象状态图中,维护不同版本的状态可能会很复杂。
Java代码示例
考虑一个简单的文本编辑器,可以保存和恢复文本状态的示例:
java复制代码
// 发起人
class Editor {
private String text;
// 设置文本
public void setText(String text) {
this.text = text;
}
// 保存状态到备忘录
public Memento save() {
return new Memento(text);
}
// 从备忘录恢复状态
public void restore(Memento memento) {
this.text = memento.getText();
}
}
// 备忘录
class Memento {
private final String text;
public Memento(String text) {
this.text = text;
}
public String getText() {
return text;
}
}
// 管理者
class Caretaker {
private List<Memento> mementoList = new ArrayList<>();
public void addMemento(Memento m) {
mementoList.add(m);
}
public Memento getMemento(int index) {
return mementoList.get(index);
}
}
// 客户端代码
public class MementoDemo {
public static void main(String[] args) {
Editor editor = new Editor();
Caretaker caretaker = new Caretaker();
editor.setText("State1");
caretaker.addMemento(editor.save());
editor.setText("State2");
caretaker.addMemento(editor.save());
// 恢复到第一个保存的状态
editor.restore(caretaker.getMemento(0));
System.out.println("Current State: " + editor.getText());
}
}
在这个例子中,Editor
类代表发起人,它可以创建和使用 Memento
对象来保存和恢复自己的状态。Memento
类是备忘录,存储 Editor
的状态。Caretaker
类负责存储 Memento
对象,但不会修改或直接访问这些对象的内容。通过这种方式,Editor
的状态可以在不违反封装原则的情况下被保存和恢复。