首页 > Design > 设计模式(10):组合模式(Composite)

设计模式(10):组合模式(Composite)

组合模式的定义

  将对象组合成树型结构以表示”部分幢整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
  组合模式的关键就在于这个抽象类,这个抽象类既可以代表叶子对象,也可以代表组合对象,这样用户在操作的时候,对单个对象和组合对象的使用就具有了一致性。

组合模式的目的

  组合模式的目的是:让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作。实现这个目标的关键之处,是设计一个抽象的组件类,让它可以代表组合对象和叶子对象。这样一来,客户端就不用区分到底操作的是组合对象还是叶子对象了,只需要把它们全部当作组件对象进行统一的操作就可以了。

对象树

  通常,组合模式会组合出树型结构来,组成这个树型结构所使用的多个组件对象,就自然地形成了对象树。这也意味着,所有可以使用对象树来描述或操作的功能,都可以考虑使用组合模式,比如读取XML文件,或是对语句进行语法解析等。

组合模式的优缺点

  定义了包含基本对象和组合对象的类层次结构
  •在组合模式中,基本对象可以被组合成复杂的组合对象,而纽合对象又可以组合成更复杂的组合对象,可以不断地递归组合下去,从而构成一个统一的组合对象的类层次结构。
  •统一了组合对象和叶子对象在组合模式中,可以把叶子对象当作特殊的组合对象看待,为它们定义统一的父类,从而把组合对象和叶子对象的行为统一起来。
  •简化了客户端调用组合模式通过统一组合对象和叶子对象,使得客户端在使用它们的时候,不需要再去区分它们,客户不关心使用的到底是什么类型的对象,这就大大简化了客户端的使用。
  •更容易扩展,由于客户端是统一地面对Component 来操作,因此,新定义的Composite 或Leaf子类能够很容易地与己有的结构一起工作,而客户端不需要为增添了新的组件类而改变。
  组合模式的缺点是很难限制组合中的组件类型。
  容易增加新的组件也会带来一些问题,比如很难限制组合中的组件类型。这在需要检测组件类型的时候,使得我们不能依靠编译期的类型约束来完成,必须在运行期间动态检测。

  1. 还没有评论
评论提交中, 请稍候...

留言


可以使用的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks