範文齋

android 責任鏈模式

最近在繼續iPhone業務的同時還需要重新拾起Android。在有些生疏的情況下,決定從Android源碼中感悟一些Android的風格和方式。在學習源碼的過程中也發現了一些通用的模式,希望通過一個系列的文章總結和分享下。

android 責任鏈模式

職責鏈模式使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞請求,直到有一個對象處理它爲止。

Android系統中根據XML排布文件創建界面的`過程中通常需要針對不同類型的控件通過各種工廠生成。考慮到效率問題,Android採用了一個標準職責鏈模式的變種,我將這稱之爲“AB計劃”。區別示意圖如下所示:

標準職責鏈

AB計劃職責鏈

LayoutInflater中的工廠職責鏈設計如下圖所示:

其中FactoryMerger包含兩個工廠f1和f2,創建時候會先通過f1創建,如果失敗會嘗試f2。而且由於FactoryMerger也實現了Factory接口,因此也可以聚合到更高一層的FactoryMerger。和標準職責鏈模式相比,無法確保各個鏈節之間的先後關係,但如果聚合合理就可以有效減少遞歸次數,實現代碼如下:

public interface Factory {

public View onCreateView(String name, Context context, AttributeSet attrs);

}

private static class FactoryMerger implements Factory {

private final Factory mF1, mF2;

FactoryMerger(Factory f1, Factory f2) {

mF1 = f1;

mF2 = f2;

}

public View onCreateView(String name, Context context, AttributeSet attrs) {

View v = eateView(name, context, attrs);

if (v != null) return v;

return eateView(name, context, attrs);

}

}

其中,Factory 和FactoryMerger 分別是LayoutInflater內嵌接口和內嵌類。

標籤:Android 責任 模式