电子游戏过去都会有一个“记录”或者“存盘”的功能,就是当玩家在游戏过程中将当前的游戏状态记录下来,以便于之后重新登录游戏后读取到记录时的状态。这种将对象的状态先保存起来,以后再根据保存的数据恢复对象状态的设计模式,就是备忘录模式。
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
大学之道,在明明德,在亲民,在止於至善