备忘录模式用于保存对象当前状态(即属性),并且在之后可以再次恢复到此状态,这有点像我们平时说的"后悔药"。备忘录模式实现的方式需要保证备保存的对象状态不能被对象从外部访问,目的是为了保护好被保存的这些对象状态的完整性以及内部实现不向外暴露。
- 定义
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可将该对象恢复到原先保存的状态。 - 使用场景
(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("退出游戏前的属性: "+this.toString());
}
//创建备忘录
public Memoto createMemoto(){
Memoto memoto = new Memoto();
memoto.mCheckpoint = mCheckpoint;
memoto.mLifeValue = mLifeValue;
memoto.mWeapon = mWeapon;
return memoto;
}
@Override
public String toString() {
return "CallOfDuty{" + "mCheckpoint=" + mCheckpoint + ", mLifeValue=" + mLifeValue + ", mWeapon=" + mWeapon + '}';
}
//恢复游戏
public void restore (Memoto memoto){
this.mCheckpoint = memoto.mCheckpoint;
this.mLifeValue = memoto.mLifeValue;
this.mWeapon = memoto.mWeapon;
System.out.println("恢复游戏后的属性: "+this.toString());
}
}
//备忘录类
public class Memoto {
public int mCheckpoint;
public int mLifeValue;
public String mWeapon;
@Override
public String toString() {
return "Memoto{" + "mCheckpoint=" + mCheckpoint + ", mLifeValue=" + mLifeValue + ", mWeapon=" + mWeapon + '}';
}
}
//管理备忘录类
public class Caretaker {
Memoto mMemoto;
public void archive (Memoto memoto){
this.mMemoto = memoto;
}
public Memoto getMemoto(){
return this.mMemoto;
}
}
public class JavaApplication2 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
//构建游戏对象
CallOfDuty game = new CallOfDuty();
game.play();
Caretaker caretaker = new Caretaker();
caretaker.archive(game.createMemoto());
game.quit();
CallOfDuty newGame = new CallOfDuty();
newGame.restore(caretaker.getMemoto());
}
}