备忘录模式
定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
备忘录模式有三个角色:
- Originator:发起人,负责创建一个备忘录,可以记录、恢复自身的内部状态。同时Originator还可以根据需要决定Memento存储自身的哪些内部状态。
- Memento:备忘录角色,用于存储Originator内部状态,并且可以防止Originator以外的对象访问Memento。
- Caretaker:看管人,负责存储备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象。
以保存游戏进度为例,退出游戏前存档,再进入游戏就会显示退出之前的状态。
代码示例
游戏发起人类
public class Game {
private int point;// 当前关数
public void play(int point) {
this.point = point;
}
public State createState() {
return new State(point, new Date().toString());
}
public void restoreState(State state) {
System.out.println(state.toString());
System.out.println("现在时间为:" + new Date().toString());
point = state.getPoint();
}
}
游戏状态类
public class State {
private int point;
private String date;
public State(int point, String date) {
super();
this.point = point;
this.date = date;
}
public int getPoint() {
return point;
}
public String toString() {
return "当前关卡:" + point + " 时间为:" + date;
}
}
游戏备忘录
public class GameCaretaker {
private State state;
public void archive(State state) {
this.state = state;
}
public State load() {
return state;
}
}
客户端
Game game = new Game();
game.play(10);// 玩到第十关
GameCaretaker gameCaretaker = new GameCaretaker();
// 存档
gameCaretaker.archive(game.createState());
// 读档
game.restoreState(gameCaretaker.load());
输出为:
当前关卡:10 时间为:Sat Apr 15 03:21:32 CST 2017
现在时间为:Sat Apr 15 03:21:32 CST 2017
甚至你可以管理一系列的状态,记录和撤销都可以,就像象棋每走一步就保存了当前的棋局,悔棋就是恢复上一步的棋局。总的来说,备忘录模式好处是给用户提供了一种可以恢复状态的机制,而且实现信息的封装,用户不需要关系状态的细节,但是保存的状态过多就会占用大量的资源。不足之处望指教。