1、意图
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
2、动机
Composite模式的关键是一个抽象类,它既可以代表图元,又可以代表图元的容器。Composite使用递归组合来进行实现。
3、适用性
1)想表示对象的部分-整体层次结构。
2)希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
4、结构
5、参与者
1)Component
-为组合中的对象声明接口。
-在适当的情况下,实现所有类共有接口的缺省行为。
-声明一个接口用于访问和管理Composite的子组件。
2)Leaf
-在组合中表示叶节点对象,叶节点没有子节点。
-在组合中定义图元对象的行为。
3)Composite
-定义有子部件的那些部件的行为。
-存储子部件
-在Component接口中实现与子部件有关的操作。
4)Client
-通过Component接口操纵组合部件的对象。
6、协作
用户使用Component类接口与组合结构中的对象进行交互。如果接收者是一个叶节点,则直接处理请求。如果接收者是Composite,它通常将请求发送给它的子部件,在转发请求之前/之后可能进行一些辅助操作。
7、效果
1)定义了包含基本对象和组合对象的类层次结构
基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断递归下去。客户代码中,任何用到基本对象的地方都可以是组合对象。
2)简化客户代码
客户可以一致的使用组合结构和单个对象。通常用户不知道(也不关心)处理的是一个节点还是一个组合组件。这就简化了客户代码,因为在定义组合的那些类中不需要写一些充斥着选择语句的函数。
3)使得更容易增加新类型的组件
新定义的Composite或Leaf子类自动地与已有的结构和客户代码一起工作,客户程序不需要因新的Component类而改变。
4)使你的设计更加一般化
容易增加新组建也会产生一些问题,那就是很难限制组合中的组件。有时你希望有些组合只能有某些特定的组件。使用Composite时,你不能依赖类型系统施加这些约束,而必须在运行时检查。