备忘录模式是一种行为设计模式,它允许你在不暴露对象实现细节的情况下保存和恢复对象的内部状态。备忘录模式通常用于实现撤销操作。
结构
- 发起人(Originator): 拥有需要备份的状态,并负责创建备忘录和恢复状态。
public class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
public Memento saveStateToMemento() {
return new Memento(state);
}
public void restoreStateFromMemento(Memento memento) {
state = memento.getState();
}
}
- 备忘录(Memento): 存储发起人的内部状态,并且可以防止发起人以外的对象访问备忘录。
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
- 负责人(Caretaker): 负责保存备忘录,但不能修改备忘录的内容。
public class Caretaker {
private Memento memento;
public void saveMemento(Memento memento) {
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
}
优点和缺点
优点:
- 封装性好: 备忘录模式将备份过程封装在单独的备忘录类中,使得发起人的状态变化对其他对象透明。
- 撤销操作: 允许发起人恢复到之前的状态,实现了撤销操作的功能。
- 易于扩展: 可以很容易地增加新的备忘录类,无需修改原有的发起人和负责人类。
缺点:
- 资源消耗: 如果需要频繁备份大量的状态,可能会消耗较多的内存资源。
示例
以下是一个备忘录模式的示例,模拟了一个文本编辑器的撤销操作。
// 备忘录类
public class Memento {
private String content;
public Memento(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
// 发起人类
public class TextEditor {
private String content;
public void setContent(String content) {
this.content = content;
}
public String getContent() {
return content;
}
public Memento save() {
return new Memento(content);
}
public void restore(Memento memento) {
content = memento.getContent();
}
}
// 负责人类
public class History {
private Stack<Memento> mementos = new Stack<>();
public void saveMemento(Memento memento) {
mementos.push(memento);
}
public Memento getMemento() {
return mementos.pop();
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
TextEditor textEditor = new TextEditor();
History history = new History();
// 编辑文本
textEditor.setContent("Version 1.0");
history.saveMemento(textEditor.save());
textEditor.setContent("Version 2.0");
history.saveMemento(textEditor.save());
// 撤销到上一个版本
textEditor.restore(history.getMemento());
System.out.println(textEditor.getContent()); // 输出:Version 2.0
// 再次撤销
textEditor.restore(history.getMemento());
System.out.println(textEditor.getContent()); // 输出:Version 1.0
}
}
在这个示例中,TextEditor 是发起人类,负责编辑文本内容。Memento 是备忘录类,保存了文本的状态。History 是负责人类,保存了历史备忘录。客户端代码演示了编辑文本、保存备忘录、撤销到上一个版本的过程。通过备忘录模式,文本编辑器可以方便地实现撤销操作。