备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象外保存这个状态,这样之后可将此对象恢复成原来的状态。测试
就拿单机游戏举例,玩游戏打boss前咱们一般都会存档,避免打boss时失误死亡好恢复存档从新开始,咱们首先看下面的例子。this
//游戏鬼泣的主角Dante类 public class Dante { //生命值 private int health; //魔法值 private int mana; public int getHealth() { return health; } public void setHealth(int health) { this.health = health; } public int getMana() { return mana; } public void setMana(int mana) { this.mana = mana; } //角色的初始状态 public void getInitState(){ this.health = 100; this.mana = 100; } public void deathState(){ this.health = 0; this.mana = 0; } public void showState(){ System.out.println("health:"+health+",mana:"+mana); } }
public class Test { public static void main(String[] args) { //初始化状态 Dante dante = new Dante(); dante.getInitState(); dante.showState(); //存档 Dante danteBak = new Dante(); danteBak.setHealth(dante.getHealth()); danteBak.setMana(dante.getMana()); //角色死亡时的状态 dante.deathState(); dante.showState(); //恢复存档 dante.setHealth(danteBak.getHealth()); dante.setMana(danteBak.getMana()); dante.showState(); } }
测试结果:spa
health:100,mana:100
health:0,mana:0
health:100,mana:100code
上面的方法虽然实现了存档,但是实现的并不优美,在测试方法中暴露了太多存档的实现细节,而且若是之后须要保存新的角色属性,那咱们就须要修改客户端,因此咱们就用到了备忘录模式,把角色属性的保存封装在单独的类中,体现“职责分离”。示例以下。对象
首先定义了一个“存储卡”类,用于保存角色数据blog
public class MemoryCard { private int health; private int mana; public int getHealth() { return health; } public void setHealth(int health) { this.health = health; } public int getMana() { return mana; } public void setMana(int mana) { this.mana = mana; } public MemoryCard(int health,int mana){ this.health =health; this.mana = mana; } }
角色状态管理者,用于保存存储卡,而且不能对存储卡的内容进行操做游戏
public class MemoryCardCreataker { private MemoryCard memoryCard; public MemoryCard getMemoryCard() { return memoryCard; } public void setMemoryCard(MemoryCard memoryCard) { this.memoryCard = memoryCard; } }
游戏角色类内存
//游戏鬼泣的主角Dante类 public class Dante { //生命值 private int health; //魔法值 private int mana; public int getHealth() { return health; } public void setHealth(int health) { this.health = health; } public int getMana() { return mana; } public void setMana(int mana) { this.mana = mana; } //角色的初始状态 public void getInitState(){ this.health = 100; this.mana = 100; } public void deathState(){ this.health = 0; this.mana = 0; } public void showState(){ System.out.println("health:"+health+",mana:"+mana); } //将角色状态保存在存储卡中 public MemoryCard saveState(){ return new MemoryCard(health,mana); } //回档 public void recoveryState(MemoryCard memoryCard){ this.health = memoryCard.getHealth(); this.mana = memoryCard.getMana(); } }
测试方法资源
public class Test { public static void main(String[] args) { //初始化状态 Dante dante = new Dante(); dante.getInitState(); dante.showState(); //存档 MemoryCardCreataker memoryCardCreataker = new MemoryCardCreataker(); memoryCardCreataker.setMemoryCard(dante.saveState()); //角色死亡时的状态 dante.deathState(); dante.showState(); //恢复存档 dante.recoveryState(memoryCardCreataker.getMemoryCard()); dante.showState(); } }
测试结果:get
health:100,mana:100
health:0,mana:0
health:100,mana:100
总结 优势:使用备忘录模式很好地将被保存的对象和保存的状态分隔开来,而且该对象状态备份和恢复不须要本身处理,而是转交给客户端处理,而且如何保存的细节封装到了存储卡中,再也不影响客户端。
缺点:因为备忘录对象会消耗内存,若是须要保存的状态占用的内存较大时,资源的消耗也就越大。