备忘录模式是一种行为型设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,以便以后可以将该对象恢复到原先保存的状态。
1. 核心思想
想象一下,你在玩游戏时,想要保存当前的游戏进度,以便之后可以从保存点继续游戏。备忘录模式就像游戏中的存档功能,它可以保存游戏角色的状态、道具、地图进度等信息,让你可以随时恢复到之前的状态。
备忘录模式的核心思想就是:在不暴露对象内部结构的情况下,保存和恢复对象的内部状态。
2. 组成要素
- Originator (发起人): 需要保存状态的类。它创建一个备忘录对象,并将自己的状态存储在备忘录中。
- Memento (备忘录): 存储 Originator 对象的内部状态。备忘录对象通常是一个私有的内部类,只有 Originator 可以访问其内部状态。
- Caretaker (管理者): 负责保存和恢复备忘录对象。Caretaker 对象通常不知道备忘录对象的具体内容,它只是简单地保存和恢复备忘录对象。
3. 代码示例 (Java)
// 发起人
class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
// 创建备忘录
public Memento createMemento() {
return new Memento(state);
}
// 恢复状态
public void restoreFromMemento(Memento memento) {
state = memento.getState();
}
// 备忘录 (内部类)
private static class Memento {
private final String state;
public Memento(String state) {
this.state = state;
}
private String getState() {
return state;
}
}
}
// 管理者
class Caretaker {
private Memento memento;
public void setMemento(Memento memento) {
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
}
// 测试
public class Client {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
// 设置初始状态
originator.setState("State 1");
System.out.println("Initial state: " + originator.getState());
// 创建备忘录并保存
caretaker.setMemento(originator.createMemento());
// 修改状态
originator.setState("State 2");
System.out.println("New state: " + originator.getState());
// 从备忘录恢复状态
originator.restoreFromMemento(caretaker.getMemento());
System.out.println("Restored state: " + originator.getState());
}
}
4. 使用场景
- 需要保存和恢复对象的内部状态,例如撤销操作、数据库事务等。
- 希望在不暴露对象内部结构的情况下,保存和恢复对象的内部状态。
5. 优缺点
优点:
- 可以在不破坏封装性的前提下,保存和恢复对象的内部状态。
- 简化了 Originator 类的代码,将状态管理的责任分离出来。
缺点:
- 如果 Originator 对象的状态需要保存的信息很多,那么备忘录对象可能会占用大量的内存。
6. 总结
备忘录模式提供了一种有效的方式来保存和恢复对象的内部状态,它可以在不破坏封装性的前提下,实现状态的保存和恢复。但是,在使用备忘录模式时,需要注意备忘录对象的大小,避免占用过多的内存。