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就用了這種思想來保存之前的狀態。

結束語

備忘錄模式還是比較簡單的一種模式,給我們提供了一種保存狀態的機制,方便回到某個歷史狀態。實現了信息封裝,不用關係狀態保存的細節。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章