Composite pattern和树
一切从,那一段代码开始的
? ? ?开始我们考虑这样一个问题,就是假定我们要写一个方法来遍历一个目录里所有的文件。因为目录里面可能还含有子目录,我们可能就需要用到循环,递归等这样的思路。一个典型的思路如下:
1. 首先列出该文件夹里所有内容。
2. 遍历里面所有的元素,如果该元素为纯文件,则显示文件名;否则,则递归调用该函数。
按照以上的思路,可以写出如下的一段简单的代码:
?
这个类图中间最取巧的一点就在于Composite这个类和Component类之间的关系。Composite首先和它有一个继承关系。另外一个Leaf类和Component也是同样的继承关系。另外,Composite与Component有一个可能的1对多的聚合或者组合关系。这意味着我一个Composite类可以包含有多个Component对象。因为前面提到的继承关系,所以我包含的可以是具体的Leaf对象,也可以是Composite对象。看到没?在这里,我们就引出了一个Composite可以包含有Composite关系的设计来了。和前面提到的我们一个目录可以包含另外一个目录,或者一个容器包含另外一个容器的说法是不是一样的呢?
牵一发而动全身? ? 实际上,如果我们可以对目录和文件做建模的话,可以做一个类似与如下的设计。我们可以定义一个抽象的File类,然后定义具体的ConcreteFile和Directory类来继承它。借鉴Composite pattern的思路,可以设计成如下图:
这个设计的具体实现代码就不赘述,其中的关节点就在于Composite类里面对displayName方法的实现。因为是一个组合类,它这个方法的实现方式类似如下:
?
其实,他们的差别主要在一下几个方面:
1:Decorator pattern主要是针对一个对象进行多重包装,所以其中的decorator和component之间基本上是1对1的关系。而composite pattern主要是体现出一个1对多的关系,更多的体现出层级的结构化。
2: Decorator pattern需要对一个decorator来继承出若干包装类,而composite不体现出要在原有元素的基础上进行什么特性的修改或增强,只是一个纯粹的对象组合,所以它的composite类就没有定义任何继承。