文章目录
- 前言
- 一、备忘录模式基本介绍
- 二、备忘录模式原理代码实现
- 备忘录对象 Memento
- 发起者 Originator
- 管理备忘录类 Caretaker
- Clint 测试类
- 三、游戏角色恢复状态实例
- 备忘录对象
- 游戏角色
- 管理备忘录对象
- 测试 Clint
- 四、备忘录模式的注意事项和细节
前言
一、备忘录模式基本介绍
二、备忘录模式原理代码实现
备忘录对象 Memento
package tanchishell.SJMS.memento.theory;//备忘录对象
public class Memento {private String state;//构造器public Memento(String state) {super();this.state = state;}public String getState() {return state;}
}
发起者 Originator
package tanchishell.SJMS.memento.theory;//发起者
public class Originator {private String state;//状态信息public String getState() {return state;}public void setState(String state) {this.state = state;}//编写一个方法,可以保存一个状态对象 Memento
//因此编写一个方法,返回 Mementopublic Memento saveStateMemento() {return new Memento(state);}//通过备忘录对象,恢复状态public void getStateFromMemento(Memento memento) {state = memento.getState();}
}
管理备忘录类 Caretaker
package tanchishell.SJMS.memento.theory;import java.util.ArrayList;
import java.util.List;//管理备忘录类
public class Caretaker {//在 List 集合中会有很多的备忘录对象private List<Memento> mementoList = new ArrayList<Memento>();public void add(Memento memento) {mementoList.add(memento);}//获取到第 index 个 Originator 的 备忘录对象(即保存状态)public Memento get(int index) {return mementoList.get(index);}
}
Clint 测试类
package tanchishell.SJMS.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 恢复到状态 1originator.getStateFromMemento(caretaker.get(0));System.out.println("恢复到状态 1 , 当前的状态是");System.out.println("当前的状态是 =" + originator.getState());}
}输出当前的状态是 = 状态#3 攻击力 50
恢复到状态 1 , 当前的状态是
当前的状态是 = 状态#1 攻击力 100
三、游戏角色恢复状态实例
备忘录对象
package tanchishell.SJMS.memento.game;//备忘录对象
public class Memento {//攻击力private int vit;//防御力private int def;public Memento(int vit, int def) {super();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 tanchishell.SJMS.memento.game;//游戏角色,发起者
public class GameRole {private int vit;private int def;//创建 Memento ,即根据当前的状态得到 Mementopublic Memento createMemento() {return new Memento(vit, def);}//从备忘录对象,恢复 GameRole 的状态public void recoverGameRoleFromMemento(Memento memento) {this.vit = memento.getVit();this.def = memento.getDef();}//显示当前游戏角色的状态public void display() {System.out.println("游戏角色当前的攻击力:" + this.vit + " 防御力: " + this.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 tanchishell.SJMS.memento.game;//守护者对象, 保存游戏角色的状态
public class Caretaker {//如果只保存一次状态private Memento memento;//对 GameRole 保存多次状态//private ArrayList<Memento> mementos;//对多个游戏角色保存多个状态//private HashMap<String, ArrayList<Memento>> rolesMementos;public Memento getMemento() {return memento;}public void setMemento(Memento memento) {this.memento = memento;}
}
测试 Clint
package tanchishell.SJMS.memento.game;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();//把当前状态保存 caretakerCaretaker caretaker = new Caretaker();caretaker.setMemento(gameRole.createMemento());System.out.println("和 boss 大战~~~");gameRole.setDef(30);gameRole.setVit(30);gameRole.display();System.out.println("大战后,使用备忘录对象恢复到站前");gameRole.recoverGameRoleFromMemento(caretaker.getMemento());System.out.println("恢复后的状态");gameRole.display();}
}输出和 boss 大战前的状态
游戏角色当前的攻击力:100 防御力: 100
和 boss 大战~~~
游戏角色当前的攻击力:30 防御力: 30
大战后,使用备忘录对象恢复到站前
恢复后的状态
游戏角色当前的攻击力:100 防御力: 100