备忘录 (Memento)
备忘录 (Memento) 是一种行为型设计模式,在不破坏封装的前提下捕获对象的内部状态,并在对象之外保存该状态,以便之后恢复(如撤销操作)。
- 需要保存对象某一时刻的状态并在之后恢复,但不想把内部字段全部暴露给外部。
- 希望支持撤销/重做、快照、历史记录等。
- 原发器 (Originator):产生状态的对象,提供
createMemento()将当前状态保存到备忘录,以及restore(memento)从备忘录恢复。 - 备忘录 (Memento):存放原发器内部状态的不可变(或受限访问)对象,只由原发器读写其内容。
- 管理者 (Caretaker):持有备忘录,不解读其内容,负责在适当时机交给原发器恢复。客户端通过管理者保存/恢复,不直接依赖备忘录内部结构。
classDiagram
class Originator {
-state String
+createMemento() Memento
+restore(Memento m) void
}
class Memento {
-state String
+getState() String
}
class Caretaker {
-memento Memento
+save(Memento m) void
+getMemento() Memento
}
Originator ..> Memento : creates
Originator ..> Memento : restores
Caretaker o-- Memento
Java 示例
Section titled “Java 示例”public class Memento { private final String state; public Memento(String state) { this.state = state; } public String getState() { return state; }}
public class Originator { private String state;
public Memento createMemento() { return new Memento(state); }
public void restore(Memento m) { this.state = m.getState(); }
public void setState(String state) { this.state = state; } public String getState() { return state; }}
public class Caretaker { private Memento memento; public void save(Memento m) { this.memento = m; } public Memento getMemento() { return memento; }}
// 客户端Originator originator = new Originator();originator.setState("状态1");Caretaker caretaker = new Caretaker();caretaker.save(originator.createMemento());originator.setState("状态2");originator.restore(caretaker.getMemento()); // 恢复为状态1备忘录通过“状态快照对象”在保持封装的前提下实现保存与恢复,是撤销、快照、历史记录的常见实现方式。