备忘录模式(Memento Pattern)

保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为模式。

角色组成

角色 描述
Originator(发起人) 创建一个备忘录以记录当前状态,并可以从备忘录中恢复状态。
Memento(备忘录) 存储发起人的内部状态,通常设置为不可变且只允许发起人访问其内容。
Caretaker(管理者) 负责保存备忘录对象,但不能对备忘录的内容进行操作或检查。

适用场景

  • 需要实现撤销/重做功能(如文本编辑器、图形工具等)。
  • 需要保存对象状态的历史记录,并在某个时刻恢复。
  • 对象的状态变化频繁,但由不想影响其封装性和性能。

代码示例

  1. 备忘录类(Memento)
1
2
3
4
5
6
7
8
9
public class Memento {
priate String state;
public Mento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
  1. 发起人(Originator)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Originator {
private String state;

public void setState(String state) {
this.state = state;
}

public String getState() {
return state;
}

public Memento saveStateToMemento() {
return new Memento(state);
}

public void restoreStateFromMemento(Remento memento) {
this.state = memento.getState();
}
}
  1. 管理者(Caretaker)
1
2
3
4
5
6
7
8
9
10
11
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);
}
}
  1. 使用示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
val originator = Originator()
val caretaker = Caretaker()

originator.setState("State #1")
originator.setState("State #2")
caretaker.addMemento(originator.saveStateToMemento())

originator.setState("State #3")
caretaker.addMemento(originator.saveStateToMemento())

originator.setState("State #4")

originator.restoreStateFromMemento(caretaker.getMemento(0))

originator.restoreStateFromMemento(caretaker.getMemento(1))