当有需要让对象返回之前的状态时,例如用户请求撤销操作,就可以使用备忘录模式。
场景描述
玩游戏时的存档就是一个很好的例子,比如游戏角色死掉后,恢复到存档时的状态。下面就来简单实现下。
代码示例
创建保存状态的Memento类
1234567891011121314151617public class GameMemento {private int hp;private int exp;public GameMemento(int hp, int exp) {this.hp = hp;this.exp = exp;}public int getHp() {return hp;}public int getExp() {return exp;}}创建游戏角色
123456789101112131415161718192021222324252627282930313233343536373839404142434445public class GamePlayer {// 角色生命值private int hp;// 角色经验值private int exp;public GamePlayer(int hp, int exp) {this.hp = hp;this.exp = exp;}/*** 生成状态快照*/public GameMemento saveTMemento() {return new GameMemento(hp, exp);}/*** 恢复到快照状态** @param memento*/public void restoreFromMemento(GameMemento memento) {this.hp = memento.getHp();this.exp = memento.getExp();}/*** 模拟游戏过程*/public void play(int hp, int exp) {this.hp += hp;this.exp += exp;}public String toString() {return "GamePlayer{" +"hp=" + hp +", exp=" + exp +'}';}}创建保存快照的管理类,下面只演示保存一份快照,真实情况可以设计复杂的结构以保存多个时间点的快照。
1234567891011121314public class GameCaretaker {private GameMemento memento;public GameMemento getMemento() {return memento;}/*** 保存快照*/public void setMemento(GameMemento memento) {this.memento = memento;}}测试
123456789101112131415161718public class Test {public static void main(String[] args) {GamePlayer player = new GamePlayer(100, 0);// 存档GameCaretaker caretaker = new GameCaretaker();caretaker.setMemento(player.saveTMemento());System.out.println(player);// 角色死亡player.play(-100, 10);System.out.println(player);// 回复到存档位置player.restoreFromMemento(caretaker.getMemento());System.out.println(player);}}
这个模式核心是把自身的状态以快照的方式保存到另外一个管理类中,以便发生意外时可以回档。本章节就到这里了。