我的博客java
備忘錄是一種行爲模式,用於保存對象當前狀態,而且在以後能夠再次恢復到此狀態。備忘錄模式實現的方式須要保證被保存的對象不能從外部訪問,目的是爲了保護好保存的這些對象狀態的完整性以及內部實現不向外部暴露。this
在不破壞封閉的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態,這樣,之後可將該對象恢復到原先保存的狀態。rest
須要保存一個對象在某一個時刻的狀態或部分狀態。code
若是用一個接口來讓其餘對象獲得這些狀態,將會暴露對象的實現細節並破壞對象的封裝性,一個對象不但願外界直接訪問其內部狀態,經過中間對象能夠間接訪問其內部狀態。orm
定義備忘錄對象
public class Memo { public int checkPoint; public int lifeValue; @Override public String toString() { return "Memo [checkPoint=" + checkPoint + ", lifeValue=" + lifeValue + "]"; } }
定義管理器接口
public class Manager { Memo memo; public void save(Memo memo) { this.memo = memo; } public Memo getMemo() { return memo; } }
定義遊戲遊戲
public class Game { private int mCheckPoint = 1; private int mLifeValue = 100; 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 exit() { System.out.println("-------------------"); System.out.println("退出遊戲前屬性:" + this.toString()); System.out.println("退出遊戲"); System.out.println("-------------------"); } public Memo createMemo() { Memo memo = new Memo(); memo.checkPoint = mCheckPoint; memo.lifeValue = mLifeValue; return memo; } public void restore(Memo memo) { mCheckPoint = memo.checkPoint; mLifeValue = memo.lifeValue; System.out.println("恢復後的遊戲屬性:" + this.toString()); } @Override public String toString() { return "Game [mCheckPoint=" + mCheckPoint + ", mLifeValue=" + mLifeValue + "]"; } }
使用內存
public class Main { public static void main(String[] args) { Game game = new Game(); //打遊戲 game.play(); Manager manager = new Manager(); //存檔 manager.save(game.createMemo()); //退出遊戲 game.exit(); //恢復遊戲 Game newGame = new Game(); newGame.restore(manager.getMemo()); } }
輸出結果
玩遊戲:第1關 進入下一關 到達2關 ------------------- 退出遊戲前屬性:Game [mCheckPoint=2, mLifeValue=90] 退出遊戲 ------------------- 恢復後的遊戲屬性:Game [mCheckPoint=2, mLifeValue=90]
備忘錄模式是在不破壞封裝的條件下,經過備忘錄對象存儲另一個對象內部的快照,在未來合適的時候把這個對象還原到存儲起來的狀態。
優勢
給用戶提供了一種能夠恢復狀態的機制,可使用戶可以比較方便地回到某個歷史的狀態。
實現了信息的封裝,使用用戶不須要關心狀態的保存細節。
缺點
消耗資源,若是類的成員變量過多,勢必會佔用較大的資源,並且每一次保存都會消耗必定的內存。