備忘錄模式:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象外保存這個狀態,這樣之後可將此對象恢復成原來的狀態。測試
就拿單機遊戲舉例,玩遊戲打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
總結 優勢:使用備忘錄模式很好地將被保存的對象和保存的狀態分隔開來,而且該對象狀態備份和恢復不須要本身處理,而是轉交給客戶端處理,而且如何保存的細節封裝到了存儲卡中,再也不影響客戶端。
缺點:因爲備忘錄對象會消耗內存,若是須要保存的狀態佔用的內存較大時,資源的消耗也就越大。