作者:粅媞em亼啡 | 来源:互联网 | 2023-09-18 15:12
电子游戏过去都会有一个“记录”或者“存盘”的功能,就是当玩家在游戏过程中将当前的游戏状态记录下来,以便于之后重新登录游戏后读取到记录时的状态。这种将对象的状态先保存起来,以后再根据
电子游戏过去都会有一个“记录”或者“存盘”的功能,就是当玩家在游戏过程中将当前的游戏状态记录下来,以便于之后重新登录游戏后读取到记录时的状态。这种将对象的状态先保存起来,以后再根据保存的数据恢复对象状态的设计模式,就是备忘录模式。
1. 备忘录模式
备忘录模式(Memento Pattern) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
备忘录模式的UML类图为:
![](https://img.php1.cn/3cd4a/1e618/bdf/129913486c37ddf6.jpeg)
- 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 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