狀態(tài)模式
不需要總結(jié)猾昆, 一句話就是說肪凛, 在不同的狀態(tài)下态蒂, 執(zhí)行不同的操作.
例如, 轉(zhuǎn)發(fā)按鈕的onClick處理, 用戶在登錄狀態(tài)下杭措, 調(diào)用轉(zhuǎn)發(fā)功能的方法, 用戶在未登錄狀態(tài)下钾恢, 調(diào)用startActivity(), 打開登錄界面.
觀察者模式
也不需要總結(jié)手素, 就是平時最常用的各種Observer和Listener.
解釋器模式
實(shí)際開發(fā)中用的很少, 典型場景是對AndroidManifest.xml的解析.
對APK文件的解析由PackageManagerService完成, 它創(chuàng)建PackageParser去解析AndroidManifest.xml瘩蚪, PackageParser內(nèi)部的實(shí)現(xiàn)機(jī)制是通過XmlPullParser對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上再繪制一遍.
備忘錄模式
使用場景是, 當(dāng)系統(tǒng)內(nèi)存不足Activity被系統(tǒng)銷毀時拱礁,onSaveInstanceState()會被調(diào)用琢锋, 用于保存當(dāng)前界面的數(shù)據(jù). 下次進(jìn)入界面時, onRestoreInstanceState(Parcelable state)會被調(diào)用, 恢復(fù)界面的數(shù)據(jù)狀態(tài).
Activity會把onSaveInstanceState()再通過window, window再通過decorView分發(fā)給所有的子view保存數(shù)據(jù)狀態(tài).
有一點(diǎn)要注意, view需要有自己的id呢灶, 才可以保存狀態(tài)吴超, 另外, view的id在一個activity布局中必須是唯一的鸯乃, 如果和其他view的id重復(fù)鲸阻, 那2個view保存的數(shù)據(jù)是相同的跋涣, 也就是說有一個view的數(shù)據(jù)保存后是錯誤的.
這是因?yàn)檫@些view的狀態(tài)是通過SparseArray來存儲的, 這相當(dāng)于一個map鸟悴, 它的key是view的id, value為view的狀態(tài).
實(shí)際項(xiàng)目中的應(yīng)用場景
除了上面說的陈辱,Activity保存數(shù)據(jù)狀態(tài).
像荔枝FM, 用戶退出再次打開時细诸, 當(dāng)前播放文件為上次退出時的文件. 這就是備忘錄模式的使用.
---DONE.----