首页 > 代码库 > 设计模式之组合模式

设计模式之组合模式

  组合(composite)模式,但从名字上就能知道这一模式属于之前我说过的结构型模式。

  在说清组合模式的概念前,得先了解一下数据结构中“树”这个概念。

  树(Tree)是n(n>=0)个结点的有限集合T,T为空时称为空树,其它情况叔这个概念要满足如下两个条件:

    1、有且仅有一个特定的称为根(Root)的结点;

    2、其余的结点可分为m(m>=0)个互不相交的子集T1/T2....,其中每个子集本身又是一棵树,并称其为根的子树(subTree)。

  上面给出的递归定义刻画了树的特性:一颗非空树是由若干课子树(也称为分支和叶子)。

  组合模式其实就是一种树形代码设计模式。

  定义:将对象以树形结构组织起来、以达成“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。

  定义有点不好理解,组合模式解决的问题是这样一个情形,在对对象(此对象有“部分-整体”的层次结构特征)使用时,能忽略对象组合和单个的不同,统一地使用结构中的所有对象。

  下面来看看组合模式的类图以加深理解:

  组合模式由三个角色组成,

    1、抽象构件角色(Component):它为组合中的对象声明接口,也可以为共有接口实现缺省行为;

    2、树叶构件角色(Leaf):在组合中表示叶节点对象--没有子节点,实现抽象构件角色声明的接口;

    3、树枝构件角色(Composite):在模式中表示分支结点对象--有子节点,实现抽象构件角色声明的接口:存储子部件。

  由类图可以看出,不管你使用的是Leaf类还是Composite类,对于客户程序来说都是一样的--客户仅仅知道Component这个抽象类的引用,这使得Composite中可以包含任何Component抽象类的子类。就像下图表示的那样:

子类管理

  组合模式的好处在对树枝结点对象的操作可以遍历到所有的叶结点,那么如何完成对叶结点的添加删除等等操作呢?所以组合模式必须提供对子对象的管理方法。管理方法包含了增加和删除两个必需方法。但是管理方法写到什么地方去呢?

  一种方式是在Component角色里面声明所有的用来管理子类对象的方法,以达到Component接口的最大化,如下图所示,好处是客户看起来接口层次上树叶和分支没有区别,保证了透明性。但是树叶是不存在子类的,因此这些管理方法对于叶子来说是多余的。

  另一种方式是只在Composite里面声明所有用来管理子类的方法,下图所示,这样就避免了上一种方式的安全性问题,但是由于叶子和分支不同,失去了透明性。

设计模式之组合模式