备忘录模式(Memento Pattern)的核心在于状态保存与恢复,它允许我们在不破坏封装性的前提下,捕获并外部化对象的内部状态。
模式结构与核心角色
- Originator(原发器):需要保存状态的对象
- Memento(备忘录):存储Originator内部状态的对象
- Caretaker(管理者):负责保存和管理备忘录对象
实战示例:文本编辑器撤销功能
// 备忘录类
class EditorMemento {
private final String content;
public EditorMemento(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
// 原发器类
class TextEditor {
private String content;
public void type(String words) {
content += words;
}
public EditorMemento save() {
return new EditorMemento(content);
}
public void restore(EditorMemento memento) {
content = memento.getContent();
}
public String getContent() {
return content;
}
}
// 管理者类
class History {
private Stack<EditorMemento> mementos = new Stack<>();
public void push(EditorMemento memento) {
mementos.push(memento);
}
public EditorMemento pop() {
return mementos.pop();
}
}
// 使用示例
public class Demo {
public static void main(String[] args) {
TextEditor editor = new TextEditor();
History history = new History();
editor.type("Hello ");
history.push(editor.save());
editor.type("World");
history.push(editor.save());
editor.type("!"); // 当前内容: "Hello World!"
editor.restore(history.pop()); // 撤销到"Hello World"
editor.restore(history.pop()); // 撤销到"Hello "
}
}
应用场景与优势
备忘录模式特别适用于:
- 撤销/重做功能:如文本编辑器、图形绘图工具
- 事务回滚:数据库操作中的状态恢复
- 游戏存档:保存和恢复游戏进度
- 快照管理:系统状态的历史记录
优势:
- 保持对象封装边界,不暴露实现细节
- 简化原发器职责,状态管理由Caretaker处理
- 提供易于实现的状态恢复机制
注意事项:
- 频繁保存状态可能导致内存占用增加
- 需要权衡保存状态的数量和频率
备忘录模式通过将状态保存和恢复的职责分离,为我们提供了一种优雅的"后悔药"机制,是构建用户友好应用程序的重要工具。
1125

被折叠的 条评论
为什么被折叠?



