备忘录模式
游戏角色状态恢复问题
传统方案解决游戏角色恢复问题
传统解决方案的问题分析
备忘录模式基本介绍
备忘录模式的原理类图
代码实现
package com.sky.memento.theory; // 原始对象 public class Originator { private String state; // 状态信息 // 提供set get 方法 public String getState() { return state; } public void setState(String state) { this.state = state; } // 编写一个方法,可以保存一个状态对象 Memento public Memento saveStateMemento(){ return new Memento(state); } // 通过备忘录对象,恢复状态 public void getStateFromMemento(Memento memento){ state = memento.getState(); } }
package com.sky.memento.theory; // 备忘录 public class Memento { private String state; // 通过构造器进行state的注入 public Memento(String state){ this.state = state; } public String getState() { return state; } }
package com.sky.memento.theory; import java.util.ArrayList; // 备忘录容器 public class CareTaker { // 创建一个备忘录集合,来保存备忘录 private ArrayList<Memento> mementoList = new ArrayList<>(); public void add(Memento memento){ mementoList.add(memento); } public Memento get(int index){ return mementoList.get(index); } }
package com.sky.memento.theory; // 客户端 public class Client { public static void main(String[] args) { Originator originator = new Originator(); CareTaker careTaker = new CareTaker(); originator.setState("状态#1 攻击力 100"); // 保存了当前的状态 careTaker.add(originator.saveStateMemento()); originator.setState("状态#2 攻击力 80"); // 保存了当前的状态 careTaker.add(originator.saveStateMemento()); originator.setState("状态#3 攻击力 50"); // 保存了当前的状态 careTaker.add(originator.saveStateMemento()); System.out.println("当前的状态是 = " + originator.getState()); // 希望得到状态1,将originator恢复到状态1 originator.getStateFromMemento(careTaker.get(0)); System.out.println("恢复到状态1,当前状态是 "); System.out.println("当前的状态是 = "+ originator.getState()); } }
当前的状态是 = 状态#3 攻击力 50
恢复到状态1,当前状态是
当前的状态是 = 状态#1 攻击力 100
游戏角色恢复状态的实例
思路分析及类图
代码实现
package com.sky.memento.game; // 游戏角色 属性类 public class GameRole { private int vit; // 攻击力 private int def; // 防御力 // 创建备忘录Memento,即根据当前的状态得到Memento public Memento createMemento(){ return new Memento(vit,def); } // 从备忘录对象,恢复初始状态 public void recoveryGameRoleFromMemento(Memento memento){ this.vit = memento.getVit(); this.def = memento.getDef(); } // 显示当前游戏的角色状态 public void display(){ System.out.println("当前角色的攻击力:"+ this.vit + " 防御力:"+ this.def); } // 提供get set 方法供外部进行修改 public int getVit() { return vit; } public void setVit(int vit) { this.vit = vit; } public int getDef() { return def; } public void setDef(int def) { this.def = def; } }
package com.sky.memento.game; // 备忘录 public class Memento { // 攻击力 private int vit; // 防御力 private int def; // 通过构造器,进行初值注入 public Memento(int vit, int def) { this.vit = vit; this.def = def; } public int getVit() { return vit; } public void setVit(int vit) { this.vit = vit; } public int getDef() { return def; } public void setDef(int def) { this.def = def; } }
package com.sky.memento.game; // 守护者对象,保存游戏角色的状态 public class Caretaker { // 如果只保存一次状态 private Memento memento; // 如果对一个对象需要保存多次状态 // private ArrayList<Memento> mementos; // // 对多个游戏角色保存多个状态 // private HashMap<String, ArrayList<Memento>> rolesMementos; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento = memento; } }
package com.sky.memento.game; import com.sky.memento.theory.CareTaker; public class Client { public static void main(String[] args) { // 创建游戏角色 GameRole gameRole = new GameRole(); gameRole.setVit(100); gameRole.setDef(100); System.out.println("和boss大战前的状态"); gameRole.display(); // 把当前状态保存到 caretaker 中 Caretaker careTaker = new Caretaker(); careTaker.setMemento(gameRole.createMemento()); System.out.println("和boss 大战~~~"); gameRole.setVit(50); gameRole.setDef(50); gameRole.display(); System.out.println("大战后,使用备忘录对象恢复到战前"); gameRole.recoveryGameRoleFromMemento(careTaker.getMemento()); gameRole.display(); } }
和boss大战前的状态
当前角色的攻击力:100 防御力:100
和boss 大战~~~
当前角色的攻击力:50 防御力:50
大战后,使用备忘录对象恢复到战前
当前角色的攻击力:100 防御力:100
备忘录模式的注意事项和细节