目录
介绍
备忘录模式是一种行为模式,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态,它的实现方式需要保证被保存的对象状态不能被从外部访问,目的是为了保护好被保存的对象状态的完整性以及内部实现不向外暴露。
定义
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可以将该对象恢复到原先保存的状态。
使用场景
1、需要保存一个对象在某一时刻的状态或者部分状态;
2、如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望对外界直接访问其内部状态,通过中间对象可以间接访问其内部状态。
代码实现
这里以玩游戏为例来说明备忘录模式的实现,我们在玩游戏时,经常会中断退出,退出前需要保存一下当前状态,下次进来时恢复到上一次退出时的状态,游戏类的伪代码如下:
public class CallOfDuty {
private int mCheckpoint = 1;
private int mLifeValue = 100;
private String mWeapon = "沙漠之鹰";
// 打游戏
public void play() {
System.out.println("打游戏 : " + String.format("第%d关", mCheckpoint) + " 奋战杀敌中");
mLifeValue -= 10;
System.out.println("进度升级啦");
mCheckpoint++;
System.out.println("到达 " + String.format("第%d关", mCheckpoint));
}
public void quit() {
System.out.println("-------------");
System.out.println("退出前的游戏属性 : " + this.toString());
System.out.println("退出游戏");
System.out.println("-------------");
}
/**
* 创建备忘录
*
* @return
*/
public Memoto createMemoto() {
Memoto memoto = new Memoto();
memoto.mCheckpoint = mCheckpoint;
memoto.mLifeValue = mLifeValue;
memoto.mWeapon = mWeapon;
return memoto;
}
public void restore(Memoto memoto) {
this.mCheckpoint = memoto.mCheckpoint;
this.mLifeValue = memoto.mLifeValue;
this.mWeapon = memoto.mWeapon;
System.out.println("恢复后的游戏属性 : " + this.toString());
}
public void setCheckPoint(int point) {
mCheckpoint = point;
}
public int getCheckpoint() {
return mCheckpoint;
}
public void setLifeValue(int mLifeValue) {
this.mLifeValue = mLifeValue;
}
public int getLifeValue() {
return mLifeValue;
}
public String getWeapon() {
return mWeapon;
}
public void setWeapon(String weapon) {
this.mWeapon = weapon;
}
@Override
public String toString() {
return "CallOfDuty [mCheckpoint=" + mCheckpoint + ", mLifeValue=" + mLifeValue
+ ", mWeapon=" + mWeapon + "]";
}
}
我们可以调用createMemoto接口创建备忘录,restore接口恢复备忘录,这样游戏中的其他状态就可以不对外暴露了。备忘录的伪代码如下:
public class Memoto {
public int mCheckpoint;
public int mLifeValue;
public String mWeapon;
@Override
public String toString() {
return "Memoto [mCheckpoint=" + mCheckpoint + ", mLifeValue=" + mLifeValue + ", mWeapon="
+ mWeapon + "]";
}
}
我们还可以创建Caretaker类来管理备忘录,源码如下:
public class Caretaker {
Memoto mMemoto;
/**
* 存档
*/
public void archive(Memoto memoto) {
this.mMemoto = memoto;
}
/**
* 获取存档
*/
public Memoto getMemoto() {
return mMemoto;
}
}
调用过程如下:
public class Client {
public static void main(String[] args) {
CallOfDuty game = new CallOfDuty();
game.play();
Caretaker caretaker = new Caretaker();
// 游戏存档
caretaker.archive(game.createMemoto());
// 退出游戏
game.quit();
// 恢复游戏
CallOfDuty newGame = new CallOfDuty();
newGame.restore(caretaker.getMemoto());
}
}
这样就很好的模拟了我们游戏存档、恢复游戏的过程,是不是很简单??呵呵,还是要说明一下,我们的伪代码都非常的简单,这不是重点,我们的重点是要学会这些思想,这才是精华,把所有的这些设计模式熟练的运用到我们的实际工作中,那才是最最重点的!!