电子游戏过去都会有一个 "记录" 或者 "存盘" 的功能, 就是当玩家在游戏过程中将当前的游戏状态记录下来, 以便于之后重新登录游戏后读取到记录时的状态. 这种将对象的状态先保存起来, 以后再根据保存的数据恢复对象状态的设计模式, 就是备忘录模式.
1. 备忘录模式
备忘录模式 (Memento Pattern) 在不破坏封装性的前提下, 捕获一个对象的内部状态, 并在该对象之外保存这个状态. 这样以后就可以将该对象恢复到原先保存的状态.
备忘录模式的 UML 类图为:
Originator: 发起人, 负责创建一个 Memento 对象, 以记录它当前的内部状态. Originator 可以根据需要, 决定 Memento 保存哪些内部状态;
Memento: 备忘录, 保存 Originator 的内部状态, 并防止其它对象访问 Originator 的状态;
Caretaker: 管理者, 负责保存 Memento 对象列表, 将 Memento 对象保存在一个聚合对象中, 恢复时可以获取 Memento.
2. 代码实现
假设在玩一款游戏, Orininator 状态 state, 代表当前对象的血量. 备忘录定义 Originator 的静态内部类.
- class Originator {
- private String state;
- public void setState(String state) {
- this.state = state;
- }
- public String getState() {
- return this.state;
- }
- /**
- * 保存当前状态到备忘录
- */
- public Memento saveToMemento() {
- System.out.println("Saving current state:" + state);
- return new Memento(this.state);
- }
- /**
- * 读取备忘录, 恢复保存的状态
- */
- public void restoreState(Memento memento) {
- System.out.println("Restore state");
- this.state = memento.getSavedState();
- }
- /**
- * 备忘录, 存储当前 Originator 状态
- */
- public static class Memento {
- final String state;
- public Memento(String s) {
- this.state = s;
- }
- public String getSavedState() {
- return this.state;
- }
- }
- }
管理备忘录
- /**
- * 管理者
- */
- class Caretaker {
- private final Map<String, Originator.Memento> mementoMap = new HashMap<>();
- /**
- * 保存状态
- */
- public synchronized void addMemento(String id, Originator.Memento memento) {
- mementoMap.put(id, memento);
- }
- /**
- * 读取状态
- */
- public synchronized Originator.Memento getMemento(String id) {
- return mementoMap.get(id);
- }
- /**
- * 删除状态
- */
- public synchronized Originator.Memento deleteMemento(String id) {
- return mementoMap.remove(id);
- }
- }
演示
- public class MementoDemo {
- public static void main(String[] args) {
- Caretaker caretaker = new Caretaker();
- Originator originator = new Originator();
- // 设置状态: 满血
- originator.setState("Full Blood");
- // 保存当前状态
- caretaker.addMemento("1",originator.saveToMemento());
- // 状态改变: 半血
- originator.setState("Half Blood");
- System.out.println(originator.getState());
- // 读取保存状态
- originator.restoreState(caretaker.getMemento("1"));
- System.out.println(originator.getState());
- }
- }
运行结果
- Saving current state: Full Blood
- Half Blood
- Restore state
- Full Blood
来源: http://www.bubuko.com/infodetail-3003250.html