1, 功能
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
Composite模式主要用于描述和解决一些具有“容器”特征的对象—它们又是对象,又是其他对象的容器。如果客户代码过多地依赖对象容器的内部实现,对象容器内部实现的变化会引起客户代码的变化,违反了设计原则中的DIP原则(高层模块不应依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象)
2, 基本思想
当我们看到“部分-整体”的概念时,就应该想到树结构,一棵树有根(整体),有枝(父部件的部分,子部件的整体---有点绕口啊!!),有叶(部分)。
为了保证部分-整体结构中,用户对单个对象和组合对象操作一致性,Composite就必须既能提供单个对象的操作,又要提供对象组合的管理。
因此,需要一个Component,为组合中的对象声明公有接口(适当情况中提供公有接口的缺省行为),这个Component还需要声明几个接口方法用于访问和管理子组件。如果需要递归访问,可以定义一个接口用于访问父节点。一棵树上所有节点都实现Component接口。
继承并实现Component的Composite就是根节点或中间节点。Composite首先是一个“容器”,它要管理它的组合对象,因此要定义管理对象组合的接口方法。同时Composite又是其“父部件”的子部件,它也要实现子部件的公有接口操作。
Leaf是“部分-整体”结构中最基础的对象。Leaf是叶节点,没有子节点,因此它没有子节点要管理。所以,Leaf中只需要实现公有接口的方法。
由若干Composite和Leaf组成了一个类似树的结构。可以参看下面的结构图。
Client对组合部件的操作是通过调用Component接口来完成。
3, 适用情况
表示对象的部分-整体层次结构
希望用户忽略组合对象与单个对象的不同,用户可以统一使用组合结构中的所有对象。
4, 结构
5, 总结
在开发过程中,当我们遇到“部分--整体”的对象结构时,我们就需要考虑是否可以用Composite模式。Composite模式具有下列优点:
Composite使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户不必关心自己处理的是单个对象还是整个组合结构。
更容易在组合体内加入对象部件,客户端不必因为加入了新对象部件而更改代码。
6, 相关模式
通常部件-父部件连接用于Responsibility of Chain模式
Decorator模式经常与Composite模式一起使用。当装饰和组合一起使用时,他们通常有一个公共的父类。
FlyWeight可以共享组件,但不能再引用他们的父部件。
Iterator可以用来遍历Composite.
Vistor将本来应该分布在Composite和Leaf类中的操作和行为局部化。
|