您的位置:首页 > 移动开发 > Android开发

Android设计模式系列(1)--SDK源码之组合模式

2016-03-14 16:32 633 查看
Android设计模式系列(1)–SDK源码之组合模式

Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用。在android UI设计,几乎所有的widget和布局类都依靠这两个类。

组合模式,Composite Pattern,是一个非常巧妙的模式。几乎所有的面向对象系统都应用到了组合模式。

1.意图

将对象View和ViewGroup组合成树形结构以表示”部分-整体”的层次结构(View可以做为ViewGroup的一部分)。

组合模式使得用户对单个对象View和组合对象ViewGroup的使用具有一致性。

2.结构



针对View和ViewGroup的实际情况,我们选择安全式的组合模式(在组合对象中添加add,remove,getChild方法),添加少许的注释,我们把上图修改为:



3.代码

View类的实现:

public class View{
//... ...
//省略了无关的方法
}


ViewGroup的实现:

public abstract class ViewGroup extends View{
/**
* Adds a child view.
*/
public void addView(View child) {
//...
}

public void removeView(View view) {
//...
}

/**
* Returns the view at the specified position in the group.
*/
public View getChildAt(int index) {
try {
return mChildren[index];
} catch (IndexOutOfBoundsException ex) {
return null;
}
}

//other methods
}


4.效果

(1).结构型模式

(2).定义了包含基本对象和组合对象的类层次结构。这种结构能够灵活控制基本对象与组合对象的使用。

(3).简化客户代码。基本对象和组合对象有一致性,用户不用区分它们。

(4).使得更容易添加新类型的组件。

(5).使你的设计变得更加一般化。

5.分类

组合模式分为透明方式与安全方式

透明方式:Component中声明所有用来管理子对象的方法,其中包括Add,Remove等,这样实现Component接口的所有子类都具备了Add和Remove,这样做的好处就是叶节点和枝节点对于外界没有区别,它们具备完全一致的行为接口,但问题也很明显,因为Leaf类本身不具备Add,Remove方法的功能,所以实现它是没有意义的。

安全方式:Component接口中不声明Add和Remove方法,那么子类的Leaf就不用去实现它,而是在Composite声明用来管理子类的方法,这样就不会出现刚才提到的问题,不过由于不够透明,所以树叶和树枝类将不具有相同的接口,客户端的调用需要做相应的判断,带来了不便。

6.使用

何时使用组合模式?

当需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑使用组合模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: