Java 备忘录模式(Memento Pattern)详解
🧠 什么是备忘录模式?
备忘录模式是一种行为型设计模式,它允许在不暴露对象实现细节的情况下,保存和恢复对象的状态。备忘录模式常常用于需要记录对象状态以便随时恢复的场景,如实现撤销操作、版本控制等。
🎯 使用场景
- 需要保存对象的状态,以便以后恢复
- 支持对象的撤销功能
- 对象的状态改变需要被保存,且不希望暴露给外部
🏗️ 模式结构
- Memento(备忘录):存储对象的内部状态,可以将状态保存在对象中
- Originator(发起人):创建备忘录,保存当前的内部状态,并可以恢复到先前保存的状态
- Caretaker(看护者):负责保存备忘录,但不能修改备忘录的内容,仅能调用恢复功能
✅ 示例:编辑器撤销操作
备忘录类
java
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
发起人类
java
public class Editor {
private String content;
public void setContent(String content) {
this.content = content;
}
public String getContent() {
return content;
}
public Memento saveState() {
return new Memento(content);
}
public void restoreState(Memento memento) {
this.content = memento.getState();
}
}
看护者类
java
import java.util.ArrayList;
import java.util.List;
public class Caretaker {
private List<Memento> mementoList = new ArrayList<>();
public void addMemento(Memento memento) {
mementoList.add(memento);
}
public Memento getMemento(int index) {
return mementoList.get(index);
}
}
客户端
java
public class Client {
public static void main(String[] args) {
Editor editor = new Editor();
Caretaker caretaker = new Caretaker();
editor.setContent("Hello");
caretaker.addMemento(editor.saveState()); // 保存当前状态
editor.setContent("Hello, World!");
caretaker.addMemento(editor.saveState()); // 保存新状态
System.out.println("Current Content: " + editor.getContent()); // 输出:Hello, World!
editor.restoreState(caretaker.getMemento(0)); // 恢复到旧状态
System.out.println("Restored Content: " + editor.getContent()); // 输出:Hello
}
}
✅ 优点
- 可以保存和恢复对象的状态,支持撤销操作
- 发起人对象不需要暴露其内部实现细节
- 备忘录对象是只读的,不可以修改,有助于封装状态
⚠️ 缺点
- 如果备忘录保存了过多的状态,可能会占用大量内存
- 增加了类的数量,导致系统复杂度增加
🧩 使用建议
备忘录模式适合需要记录对象状态并支持恢复功能的场景,如文本编辑器的撤销操作、游戏的存档功能等。