定义
名称: composite 结构: 意图: 将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。 适用性:
|
经典案例
1、Java AWT Component-Container
毫无疑问的,AWT中的Component-Container体系就是一个很好的Composite模式的例子。Container继承于Component,而Container中有可以包含有多个Component,因为Container实际上也是Component,因而Container也可以包含Container。这样通过Component-Container结构的对象组合,形成一个树状的层次结构。这也就是Composite模式所要做的。
Composite模式是为了简化编程而提出的,一般的在编程的时候,如果严格的区分Component和Container的话,有时候会带来许多不便,而且这些往往是没有必要的。比如,我要在一个Container中放置一个Component,我并不需要知道这个Component到底是一个Container,或者就是一个一般的Component,在父级容器中所要做的,只是记录一个Component的引用,在需要的时候调用Component的绘制方法来显示这个Component。当这个Component确实是一个Container的时候,它可以通过Container重载后的绘制方法,完成对这个容器的显示,并把绘制消息传递给到它的子对象去。也就是说,对一个父级容器而言,它并不不关心,其子对象到底是一个Component,还是一个Container。它需要将Component和Container统一对待。
2、JUnit
最佳实践
1、Composite优缺点
优点:对于Composite模式,也许人们一开始的注意力会集中在它是如何实现组合对象的。但Composite最重要之处在于用户并不关心是组合对象还是单个对象,用户将以统一的方式进行处理,所以基类应是从单个对象和组合对象中提出的公共接口。
缺点:Composite最大的问题在于不容易限制组合中的组件。
使用改进的composite模式可以缓和这个矛盾,见参考文章2。
相关模式
1、visitor / iterator
在对composite中的元素进行集体操作或遍历操作时,经常使用visitor模式和iterator模式
参考文章
1、设计模式之Composite(组合)
http://dev.csdn.net/article/52/52259.shtm
2、从Java类库看设计模式 (Composite,Strategy,Iterator)
http://www.sawin.com.cn/doc/SD/UML/classlib.htm
3、诊断 Java 代码: 深度优先访问器和中断的分派
http://www-900.ibm.com/developerWorks/cn/java/j-diag/part20/index.shtml