Android 備忘錄模式
Android 設計模式系列文章Android 23種設計模式
前言
備忘錄模式顧名思義,就是儲存當前某個狀態,再經歷過一些變化過後,還能恢復到這個狀態。我們接觸的比較多的是遊戲裡邊的存檔。影音播放器儲存百分比等。我們要實現這個功能很簡單,有很多種,備忘錄模式就是方法之一。備忘錄模式的特點就是保證被儲存的物件狀態不能被物件從外部訪問。目的是保證狀態的完整性和內部實現不暴露。
備忘錄模式定義
在不破壞封閉的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。
例子
我們以mp3播放器為例,舉一個簡單的備忘錄模式的例子。
1、先建立一個我們要儲存的狀態集合類,儲存歌名,播放模式,播放百分比
public class Memoto { String songName; String mode; Float percent; }
2、再建立一個單獨管理狀態集合類的類,用來儲存和讀取狀態。
public class Caretaker { Memoto memoto; public void saveMemoto (Memoto memoto) { this.memoto = memoto; } public Memoto getMemoto() { return memoto; } }
3、定義Mp3播放類,只是模擬功能,寫的很簡單
public class Mp3 { static final String TAG = Mp3.class.getSimpleName(); private String songName; private String mode; private float percent; public void play() { songName = "浮誇"; Log.d(TAG,"正在聽 " + songName); mode = "低音炮"; Log.d(TAG,"當前播放模式 " + mode); percent = 0.15f; Log.d(TAG,"播放百分比 " + percent); } public void quit () { Log.d(TAG,"退出播放"); } public Memoto saveMemoto() { Memoto memoto = new Memoto(); memoto.songName = songName; memoto.mode = mode; memoto.percent = percent; return memoto; } public void restore(Memoto memoto) { songName = memoto.songName; mode = memoto.mode; percent = memoto.percent; Log.d(TAG,"恢復播放 歌曲: " + songName + " 播放模式: " + mode + " 播放百分比: " + percent); } }
play模擬正在播放,saveMemoto用來間接訪問狀態。 restore用來恢復
4、最後我們來看下呼叫和log
Mp3 mp3 = new Mp3(); Caretaker caretaker = new Caretaker(); mp3.play(); caretaker.saveMemoto(mp3.saveMemoto()); mp3.quit(); mp3.restore(caretaker.getMemoto());
Log輸出如下:
11-26 10:52:07.879 8785-8785/com.yink.designpattern.designpattern D/Mp3: 正在聽 浮誇 11-26 10:52:07.879 8785-8785/com.yink.designpattern.designpattern D/Mp3: 當前播放模式 低音炮 11-26 10:52:07.879 8785-8785/com.yink.designpattern.designpattern D/Mp3: 播放百分比 0.15 11-26 10:52:07.879 8785-8785/com.yink.designpattern.designpattern D/Mp3: 退出播放 11-26 10:52:07.879 8785-8785/com.yink.designpattern.designpattern D/Mp3: 恢復播放 歌曲: 浮誇 播放模式: 低音炮 播放百分比: 0.15
備忘錄模式小結
結果顯而易見,備忘錄模式思想也很簡單,儲存之前狀態。用單獨的類來儲存和讀取狀態。避免直接訪問資料和內部實現。我們Activity的Bundle savedInstanceState就用了這種思想來儲存之前的狀態。
結束語
備忘錄模式還是比較簡單的一種模式,給我們提供了一種儲存狀態的機制,方便回到某個歷史狀態。實現了資訊封裝,不用關係狀態儲存的細節。