
设计模式之备忘录模式
备忘录模式
定义:备忘录模式用于在不破坏封装的前提下,捕获对象的状态并在以后恢复。它提供了一种数据快照的机制,使得对象可以回滚到某个历史状态,常用于撤销(Undo)操作。
核心角色
1.发起人(Originator)
- 负责创建备忘录,并存储当前状态。
- 可以根据备忘录恢复先前的状态。
2.备忘录(Memento)
- 存储发起人的内部状态。
- 保护发起人的状态不被外界修改(通常是不可变的)。
3.管理者(Caretaker)
- 负责保存和恢复备忘录。
- 不会修改备忘录的内容,只用于存储和提供给Originator进行恢复。
示例代码(Java实现)
1️⃣ 备忘录(Memento)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
public class Memento {
private final String state;
public Memento(String state) { this.state = state; }
public String getState() { return state; } }
|
2️⃣ 发起人(Originator)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
public class Originator { private String state;
public void setState(String state) { this.state = state; System.out.println("当前状态: " + state); }
public Memento saveStateToMemento() { return new Memento(state); }
public void restoreFromMemento(Memento memento) { this.state = memento.getState(); System.out.println("状态恢复为:" + state); }
@Override public String toString() { return "Originator{" + "state='" + state + '\'' + '}'; } }
|
3️⃣ 管理者(Caretaker)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import java.util.ArrayList; import java.util.List;
public class Caretaker { private final List<Memento> history = new ArrayList<>();
public void addMemento(Memento memento) { history.add(memento); }
public Memento getMemento(int index) { return history.get(index); } }
|
创建测试类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
public class MementoPatternDemo { public static void main(String[] args) { Originator originator = new Originator(); Caretaker caretaker = new Caretaker();
originator.setState("状态1"); caretaker.addMemento(originator.saveStateToMemento());
originator.setState("状态2"); caretaker.addMemento(originator.saveStateToMemento());
originator.setState("状态3"); caretaker.addMemento(originator.saveStateToMemento()); System.out.println("当前状态:" + originator);
originator.restoreFromMemento(caretaker.getMemento(0)); } }
|
输出结果
1 2 3 4 5
| 当前状态: 状态1 当前状态: 状态2 当前状态: 状态3 当前状态:Originator{state='状态3'} 状态恢复为:状态1
|
应用场景
- 文本编辑器的撤销功能(Word、记事本)
- 游戏存档(保存和恢复游戏进度)
- 事务管理(数据库事务回滚)
- IDE代码撤销/恢复(Ctrl+Z & Ctrl+Y)
总结
- 备忘录模式用于保存对象的历史状态,便于后续恢复。
- 适用于撤销、恢复、存档等功能,但需要注意内存消耗。
- 三大角色(发起人、备忘录、管理者)各司其职,保证封装性。