一 Composite模式
将对象组合成树形结构以表示“部分——整体”的层次结构。
Composite使得用户对单个对象操作和组合对象的操作使用具有一致性。
这里面涉及到单个对象和组合对象的操作问题。
将单个对象和组合对象一致的对待能使:客户代码一致简单,
使用更加灵活多变,便于扩展新的组合对象,便于对象的管理等。
统一对待单个对象和组合对象,势必要提供一些组合对象需要而单个对象不需要的操作或者属性等管理手段,
这些手段对与单个对象或许根本不存在或者不适用,这样势必存在着一定风险隐患,造成不安全因素的存在。
但是单个对象和组合对象必然存在一些不同的地方,要将单个对象与组合对象一致对待,
是在安全性与透明性中选择了透明性。如果选择安全性,那么单个对象与组合对象是要进行区别对待。
进行怎么样的区别对待呢,这个不确定性很多但是可以确定是组合对象存在着如何对子对象进行管理。
下面学习一下Android中View类层次结构。
二 Android中View管理
Adnroid中用于显示的控件的基类是View,很多基本的控件Widget如:
ImageView,TextView等都是直接从view派生下来;另一些支持组合的控件都是ViewGroup派生下来。
控件类层次关系如下图:
所以在Android中View的所使用组合模式中对于单个对象和组合对象是部分区别对待的:
单个对象都是从View派生下来或者再继续派生;组合对象都是从ViewGroup派生下来才能接收单个对象。
但是这个区别仅限于单个对象还是组合对象,但终究仍然都是View。所以是部分区别对待的。
下面简单学习一下ViewGroup对于其子对象的管理。
三 ViewGroup对于子对象的管理
ViewGroup是一个抽象类,用来管理下一层的Views包括基本控件和组合控件——控件的容器。
常见从ViewGroup继承下来的有:五大布局分别是:FrameLayout(框架布局),LinearLayout (线性布局),
AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局).以及 ListView,GridView等等。
ViewGroup对子类的管理看似比较简单,使用了一个数组来管理。
ViewGroup类中有一个成员:private View[] mChildren;用来保存其上所有的子对象;
初始大小为12超过遗弃重新申请,这可能就是利用Java内存管理的方便吧,不用主动去负责ViewGroup的子对象的销毁。
在View中有一个成员:protected ViewParent mParent; 为每一个View都指定了其唯一Parent。
至于这样区别对待的优点:满足模式中所提到的安全性,毕竟单个对象和组合对象还是有区别的,
组合对象的操作更加复杂,需要管理其子对象:显示属性和焦点事件处理派发等,而单个对象显然不需要具备这些,
若不加区分存在潜在使用上的安全隐患和单个对象不必要的复杂性;至于还有其他什么原因上的考虑就不得知了,期待达人解答。