狀態模式
不需要總結, 一句話就是說, 在不同的狀態下, 執行不同的操作.
例如, 轉發按鈕的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.----