狀態(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.----