备忘录模式是一种行为模式,用于保存对象当前状态。在之后可以再次恢复状态。在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象外保存这个状态,这样,以后就可以将该对象恢复到以前的状态。
使用场景:(1) 需要保存一个对象在某一时刻的状态或者部分状态。
(2) 如果使用一个接口来让其他对象得到这些状态,将会暴露对象的筛选细节,并破坏对象的封装性;一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访问其内部状态。
1 创建一个备忘录类:
package momentopatttern;
/**
* 作为 备忘录
*/
public class Memoto {
public int mCheckPoint ;
public int mLifeValue ;
public String mWeapon ;
@Override
public String toString() {
return "Memoto [mCheckPoint=" + mCheckPoint + ", mLifeValue="
+ mLifeValue + ", mWeapon=" + mWeapon + "]";
}
}
2 创建一种状态:
package momentopatttern;
/**
* 相当于 originator
*/
public class CallOfDutyGame {
private int mCheckPoint = 1;
private int mLifeValue = 100;
private String mWeapon = "沙漠之鹰";
/**
* 玩游戏
*/
public void play(){
System.out.println("开始玩游戏-------" + this);
mLifeValue -=10;
mCheckPoint++;
System.out.println("开始玩游戏 属性变化= "+this.toString());
}
/**
* 退出游戏
*/
public void quit(){
System.out.println("退出游戏-----"+this.toString());
}
/**
* 创建备忘录
* @return
*/
public Memoto creatMemotoeMemoto(){
Memoto memoto = new Memoto();
memoto.mCheckPoint = mCheckPoint;
memoto.mLifeValue = mLifeValue;
memoto.mWeapon = mWeapon;
return memoto;
}
/**
* 恢复游戏
* @param memoto
*/
public void restore(Memoto memoto){
mCheckPoint = memoto.mCheckPoint;
mLifeValue = memoto.mLifeValue;
mWeapon = memoto.mWeapon;
System.out.println("恢复后的游戏属性" + this.toString());
}
@Override
public String toString() {
return "CallOfDutyGame [mCheckPoint=" + mCheckPoint + ", mLifeValue="
+ mLifeValue + ", mWeapon=" + mWeapon + "]";
}
}
3 备忘录管理者:
package momentopatttern;
/**
* 管理备忘录 唯一改变备忘录的入口
*/
public class Caretaker {
Memoto memoto;
public Memoto getMemoto() {
return memoto;
}
public void setMemoto(Memoto memoto) {
this.memoto = memoto;
}
}
4 测试类:
package momentopatttern;
public class Client {
public static void main(String[] args) {
// 创建游戏对象
CallOfDutyGame game = new CallOfDutyGame();
// 打游戏
game.play();
// 创建备忘录管理者
Caretaker caretaker = new Caretaker();
// 游戏状态存档
caretaker.setMemoto(game.creatMemotoeMemoto());
// 退出游戏
game.quit();
// 恢复游戏
CallOfDutyGame game2 = new CallOfDutyGame();
game2.restore(caretaker.getMemoto());
}
}