学者谷

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 责任 模式