Android 備忘錄模式

Android 23種設(shè)計模式

前言

備忘錄模式顧名思義,就是保存當(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é)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 場景問題# 1.1 開發(fā)仿真系統(tǒng)## 考慮這樣一個仿真應(yīng)用,功能是:模擬運行針對某個具體問題的多個解決方案,記...
    七寸知架構(gòu)閱讀 2,248評論 1 50
  • 設(shè)計模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計原則時需要注意以下幾點:a) 高內(nèi)聚、低耦合和單一職能的“沖突”實際上,這兩者...
    彥幀閱讀 3,885評論 0 14
  • 1.初識備忘錄模式 在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對...
    王偵閱讀 590評論 0 0
  • 往前,走的是路,看的是景,一路景色,一路心情。久久支撐往前的是無盡的能量。時間使你我成為過程,在長長的往前...
    冰夫閱讀 148評論 0 0
  • 素色云華漫碧袖 紛繁萍影綴清鎜 蟬音熠熠未覺倦 故道茵茵似鐫盤
    茗香酒影閱讀 164評論 0 2

友情鏈接更多精彩內(nèi)容