1、例子
游戏角色状态恢复问题
游戏角色有攻击力和防御力,在大战
Boss
前保存自身的状态
(
攻击力和防御力
)
,当大
战
Boss
后攻击力和防御力下降,从备忘录对象恢复到大战前的状态
传统分析:
1)
一个对象,就对应一个保存对象状态的对象, 这样当我们游戏的对象很多时,不
利于管理,开销也很大
.
2)
传统的方式是简单地做备份,
new
出另外一个对象出来,再把需要备份的数据放到
这个新对象,但这就暴露了对象内部的细节
3)
解决方案:
=>
备忘录模式
2、基本定义
1)
备忘录模式(
Memento Pattern
)在不破坏封装性的前提下,捕获一个对象的内
部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保
存的状态
2)
可以这里理解备忘录模式:现实生活中的备忘录是用来记录某些要去做的事情,
或者是记录已经达成的共同意见的事情,以防忘记了。而在软件层面,备忘录
模式有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或者某
些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作
3)
备忘录模式属于行为型模式
3、代码
public class Caretaker {
private Memento memento;
private ArrayList<Memento> mementoArrayList;
private HashMap<String,ArrayList<Memento>> map;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
public class GameRole {
private int vit;
private int def;
public Memento createMemento(){
return new Memento(vit,def);
}
public void recoverGameRoleFromMemento(Memento memento){
this.vit=memento.getVit();
this.def=memento.getDef();
}
public void display(){
System.out.println("攻击力"+this.def+"防御力"+this.vit);
}
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;
}
}
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;
}
}
public class Client {
public static void main(String[] args) {
GameRole gameRole = new GameRole();
gameRole.setDef(100);
gameRole.setVit(100);
gameRole.display();
Caretaker caretaker=new Caretaker();
caretaker.setMemento(gameRole.createMemento());
gameRole.setVit(30);
gameRole.setDef(30);
gameRole.display();
gameRole.recoverGameRoleFromMemento(caretaker.getMemento());
gameRole.display();
}
}
总结:
使用几个类做中间存储数据和获取状态