前言
備忘錄模式顧名思義,就是保存當(dāng)前某個狀態(tài),再經(jīng)歷過一些變化過后,還能恢復(fù)到這個狀態(tài)。我們接觸的比較多的是游戲里邊的存檔。影音播放器保存百分比等。我們要實現(xiàn)這個功能很簡單,有很多種,備忘錄模式就是方法之一。備忘錄模式的特點就是保證被保存的對象狀態(tài)不能被對象從外部訪問。目的是保證狀態(tài)的完整性和內(nèi)部實現(xiàn)不暴露。
備忘錄模式定義
在不破壞封閉的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)。
例子
我們以mp3播放器為例,舉一個簡單的備忘錄模式的例子。
1、先創(chuàng)建一個我們要保存的狀態(tài)集合類,保存歌名,播放模式,播放百分比
public class Memoto {
String songName;
String mode;
Float percent;
}
2、再創(chuàng)建一個單獨管理狀態(tài)集合類的類,用來保存和讀取狀態(tài)。
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,"當(dāng)前播放模式 " + 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,"恢復(fù)播放 歌曲: " + songName + " 播放模式: " + mode + " 播放百分比: " + percent);
}
}
play模擬正在播放,saveMemoto用來間接訪問狀態(tài)。 restore用來恢復(fù)
4、最后我們來看下調(diào)用和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: 當(dāng)前播放模式 低音炮
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: 恢復(fù)播放 歌曲: 浮夸 播放模式: 低音炮 播放百分比: 0.15
備忘錄模式小結(jié)
結(jié)果顯而易見,備忘錄模式思想也很簡單,保存之前狀態(tài)。用單獨的類來保存和讀取狀態(tài)。避免直接訪問數(shù)據(jù)和內(nèi)部實現(xiàn)。我們Activity的Bundle savedInstanceState就用了這種思想來保存之前的狀態(tài)。
結(jié)束語
備忘錄模式還是比較簡單的一種模式,給我們提供了一種保存狀態(tài)的機制,方便回到某個歷史狀態(tài)。實現(xiàn)了信息封裝,不用關(guān)系狀態(tài)保存的細節(jié)。