設(shè)計(jì)模式之狀態(tài)模式, 觀察者模式, 命令模式, 備忘錄模式

狀態(tài)模式

不需要總結(jié), 一句話就是說, 在不同的狀態(tài)下, 執(zhí)行不同的操作.
例如, 轉(zhuǎn)發(fā)按鈕的onClick處理, 用戶在登錄狀態(tài)下, 調(diào)用轉(zhuǎn)發(fā)功能的方法, 用戶在未登錄狀態(tài)下, 調(diào)用startActivity(), 打開登錄界面.

觀察者模式

也不需要總結(jié), 就是平時(shí)最常用的各種Observer和Listener.

解釋器模式

實(shí)際開發(fā)中用的很少, 典型場(chǎng)景是對(duì)AndroidManifest.xml的解析.
對(duì)APK文件的解析由PackageManagerService完成, 它創(chuàng)建PackageParser去解析AndroidManifest.xml, PackageParser內(nèi)部的實(shí)現(xiàn)機(jī)制是通過XmlPullParser對(duì)xml文件完成解析工作.

命令模式

典型應(yīng)用是GUI中的繪圖程序, 用命令模式實(shí)現(xiàn)“撤銷”操作.

public class DrawInvoker {

    //繪制列表
    private List<DrawPath> drawList = Collections.synchronizedList(new ArrayList<DrawPath>());

    //重做列表
    private List<DrawPath> redoList = Collections.synchronizedList(new ArrayList<DrawPath>());

    //添加一條命令
    public void add(DrawPath command) {
        redoList.clear();
        drawList.add(command);
    }

    //撤銷操作
    public void undo() {
        if(drawList.size() >0 ) {
            DrawPath undo = drawList.get(drawList.size() - 1);
            drawList.remove(drawList.size() - 1); // 把drawList中的最后一條命令刪除掉.
            undo.undo();
            redoList.add(undo);
        }
    }
}

“撤銷”上一步操作的實(shí)現(xiàn)原理是, 首先記錄每一條繪制命令到drawList中, “撤銷”操作就是把最后一條命令從drawList中刪除, 然后把canvas清空, 把drawList中的命令在清空的canvas上再繪制一遍.

備忘錄模式

使用場(chǎng)景是, 當(dāng)系統(tǒng)內(nèi)存不足Activity被系統(tǒng)銷毀時(shí),onSaveInstanceState()會(huì)被調(diào)用, 用于保存當(dāng)前界面的數(shù)據(jù). 下次進(jìn)入界面時(shí), onRestoreInstanceState(Parcelable state)會(huì)被調(diào)用, 恢復(fù)界面的數(shù)據(jù)狀態(tài).
Activity會(huì)把onSaveInstanceState()再通過window, window再通過decorView分發(fā)給所有的子view保存數(shù)據(jù)狀態(tài).
有一點(diǎn)要注意, view需要有自己的id, 才可以保存狀態(tài), 另外, view的id在一個(gè)activity布局中必須是唯一的, 如果和其他view的id重復(fù), 那2個(gè)view保存的數(shù)據(jù)是相同的, 也就是說有一個(gè)view的數(shù)據(jù)保存后是錯(cuò)誤的.
這是因?yàn)檫@些view的狀態(tài)是通過SparseArray來(lái)存儲(chǔ)的, 這相當(dāng)于一個(gè)map, 它的key是view的id, value為view的狀態(tài).

實(shí)際項(xiàng)目中的應(yīng)用場(chǎng)景
除了上面說的,Activity保存數(shù)據(jù)狀態(tài).
像荔枝FM, 用戶退出再次打開時(shí), 當(dāng)前播放文件為上次退出時(shí)的文件. 這就是備忘錄模式的使用.

---DONE.----

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

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

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