設計模式 --- 備忘錄模式
阿新 • • 發佈:2018-11-22
1.定義
在不破壞封閉的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態,這樣以後就可將物件恢復到原先儲存的狀態。
2.使用場景
1)需要儲存一個物件在某一個時刻的狀態或部分狀態
2)如果用一個介面來讓其他物件得到這些狀態,將會暴露物件的實現細節並破壞物件的封裝性,一個物件不希望外界直接訪問內部狀態,通過中間物件可以間接訪問其內部物件。
3.簡單實現
模擬一個遊戲存檔的功能。
//定義一個遊戲類 class Game{ private int lifeValue = 100; //遊戲人物生命值 private int mLevel = 1; //遊戲人物等級 private String mWeapon = "新手劍"; //人物裝備 //模擬玩遊戲 public void playGame(){ System.out.println("碰見了一隻 野豬 ! 奮力搏鬥中..."); System.out.println("你損失了 -10HP !"); lifeValue -= 10; System.out.println(this.toString()); System.out.println("你擊殺了 野豬 ! 升級!"); mLevel += 1; System.out.println(this.toString()); System.out.println("野豬 爆出了 屠龍寶刀! 裝備中..."); mWeapon = "屠龍寶刀"; System.out.println(this.toString()); } //退出遊戲 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.lifeValue = lifeValue; memoto.mLevel = mLevel; memoto.mWeapon = mWeapon; return memoto; } //恢復遊戲 public void reStore(Memoto memoto){ System.out.println("--------------------------------------"); System.out.println("存檔讀取中..."); this.lifeValue = memoto.lifeValue; this.mLevel = memoto.mLevel; this.mWeapon = memoto.mWeapon; System.out.println("當前屬性:" + this.toString()); System.out.println("--------------------------------------"); } @Override public String toString() { return "[ Level:"+ this.mLevel +" Life:"+ lifeValue+" Weapone:"+ mWeapon+" ]"; } } //建立一個備忘錄 class Memoto{ public int lifeValue; public int mLevel ; public String mWeapon ; @Override public String toString() { return "[ Level:"+ this.mLevel +" Life:"+ lifeValue+" Weapone:"+ mWeapon+" ]"; } } //備忘錄操作者 class Caretaker{ Memoto memoto; //存檔 public void archive(Memoto memoto){ this.memoto = memoto; } //讀檔 public Memoto getMemoto(){ return memoto; } } public class OriginatorMode { public static void main(String[] args){ //構建遊戲物件 Game game = new Game(); //打遊戲 game.playGame(); //遊戲存檔 Caretaker caretaker = new Caretaker(); caretaker.archive(game.createMemoto()); //退出遊戲 game.quit(); //重新恢復遊戲 重新新建一個物件 Game gameTwo = new Game(); gameTwo.reStore(caretaker.getMemoto()); } }
輸出:
4.小結
優點:
1.給使用者提供了一種可以恢復狀態的機制,比較方便地回到某個歷史狀態;
2.實現了資訊的封裝,使使用者不需要關心狀態的儲存細節。
缺點:
資源消耗,如果類的成員變數太多,會佔用較大資源,而且每一次儲存會消耗一定的記憶體資源。