适用场景
1)在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们。
2)在一个使用面向对象语言开发的系统中需要处理一个树形结构。
3)在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型。
主要优点:
1)可以清楚地定义分层次的复杂对象,让客户端忽略了层次的差异,方便对整个层次结构进行控制。
2)在组合模式中添加新的容器构建和叶子构建都很方便,无需对现有类库进行任何修改,符合“开闭原则”。
其结构如图所示:
结构解析
组合结构给人感觉就是类似于树的概念,在树中,有些节点是终极节点Leaf:它不可挂接其它节点;而有些则是容器节点Composite:它下面可挂容器和终极节点Leaf。我们可以类比于操作系统的文件结构。文件夹就是Composite,而文件则是Leaf。
作为客户端,如果在处理容器Composite和终极节点Leaf时,太过注重类型的话,则在创建的过程中,会出现大量的if判断语句,且程序的扩展性、开闭原则都处于不利的状态,简而言之就是太过程化了。
Composite模式的出现就是利用OOP的思想,将容器、终极节点等进行抽象,而后通过多态的手法,实现对树或者其它客户端不需要对层次太注重的结构进行操作。
Composite模式有两种实现方法,一种为透明组合模式,另一种为安全组合模式。在参考资料时,找到一份对Composite模式所得很详细的资料,因此接下去就附上网址供大家参照: https://quanke.gitbooks.io/design-pattern-java/content/%E7%BB%84%E5%90%88%E6%A8%A1%E5%BC%8F-Composite%20Pattern.html