跳转到内容

备忘录 (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
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

备忘录通过“状态快照对象”在保持封装的前提下实现保存与恢复,是撤销、快照、历史记录的常见实现方式。