設計模式之狀態模式, 觀察者模式, 命令模式, 備忘錄模式

狀態模式

不需要總結, 一句話就是說, 在不同的狀態下, 執行不同的操作.
例如, 轉發按鈕的onClick處理, 用戶在登錄狀態下, 調用轉發功能的方法, 用戶在未登錄狀態下, 調用startActivity(), 打開登錄界面.

觀察者模式

也不需要總結, 就是平時最常用的各種Observer和Listener.

解釋器模式

實際開發中用的很少, 典型場景是對AndroidManifest.xml的解析.
對APK文件的解析由PackageManagerService完成, 它創建PackageParser去解析AndroidManifest.xml, PackageParser內部的實現機制是通過XmlPullParser對xml文件完成解析工作.

命令模式

典型應用是GUI中的繪圖程序, 用命令模式實現“撤銷”操作.

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);
        }
    }
}

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

備忘錄模式

使用場景是, 當系統內存不足Activity被系統銷毀時,onSaveInstanceState()會被調用, 用于保存當前界面的數據. 下次進入界面時, onRestoreInstanceState(Parcelable state)會被調用, 恢復界面的數據狀態.
Activity會把onSaveInstanceState()再通過window, window再通過decorView分發給所有的子view保存數據狀態.
有一點要注意, view需要有自己的id, 才可以保存狀態, 另外, view的id在一個activity布局中必須是唯一的, 如果和其他view的id重復, 那2個view保存的數據是相同的, 也就是說有一個view的數據保存后是錯誤的.
這是因為這些view的狀態是通過SparseArray來存儲的, 這相當于一個map, 它的key是view的id, value為view的狀態.

實際項目中的應用場景
除了上面說的,Activity保存數據狀態.
像荔枝FM, 用戶退出再次打開時, 當前播放文件為上次退出時的文件. 這就是備忘錄模式的使用.

---DONE.----

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容