备忘录模式
定义: 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可将该对象恢复到原先保存的状态.
使用场景:
- 需要保存一个对象在某个时刻的状态或者部分状态.
- 如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性.一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访问其内部状态.
优点: 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态. 实现了信息的封装,使得用户不需要关心状态的保存细节.
缺点: 消耗资源,如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存.
举个游戏存档的例子:
//使命召唤游戏
public class CallOfDuty {
private int checkPoint = 1;
private int lifeValue = 100;
private String weapon = "沙漠之鹰";
//玩游戏
public void play(){
System.out.println("玩游戏 :"+String.format("第%d关",checkPoint)+"奋战杀敌中");
lifeValue -=10;
System.out.println("进度升级啦");
checkPoint++;
System.out.println("到达 "+String.format("第%d关",checkPoint));
}
//退出游戏
public void quit(){
System.out.println("-------------");
System.out.println("退出前的游戏属性 :"+this.toString());
System.out.println("退出游戏");
System.out.println("-------------");
}
//创建备忘录
public Memoto createMemoto(){
Memoto memoto = new Memoto();
memoto.checkPoint = checkPoint;
memoto.lifeValue = lifeValue;
memoto.weapon = weapon;
return memoto;
}
public void restore(Memoto memoto){
this.checkPoint = memoto.checkPoint;
this.lifeValue = memoto.lifeValue;
this.weapon = memoto.weapon;
System.out.println("恢复后的游戏属性 :"+ this.toString());
}
@Override
public String toString() {
return "CallOfDuty{" +
"checkPoint=" + checkPoint +
", lifeValue=" + lifeValue +
", weapon='" + weapon + '\'' +
'}';
}
}
//备忘录类
public class Memoto {
public int checkPoint;
public int lifeValue;
public String weapon;
@Override
public String toString() {
return "Memoto{" +
"checkPoint=" + checkPoint +
", lifeValue=" + lifeValue +
", weapon='" + weapon + '\'' +
'}';
}
}
//负责管理Memoto
public class Caretaker {
Memoto memoto; //备忘录
//存档
public void archive(Memoto memoto){
this.memoto = memoto;
}
//获取存档
public Memoto getMemoto() {
return memoto;
}
}
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());
}
打印出的内容:
玩游戏 :第1关奋战杀敌中
进度升级啦
到达 第2关
-------------
退出前的游戏属性 :CallOfDuty{checkPoint=2, lifeValue=90, weapon='沙漠之鹰'}
退出游戏
-------------
恢复后的游戏属性 :CallOfDuty{checkPoint=2, lifeValue=90, weapon='沙漠之鹰'}
存取操作 都是通过 CareTaker 类来完成,屏蔽了外界对 CallOfDuty 角色的直接访问.