码迷,mamicode.com
首页 > 其他好文 > 详细

小菜学设计模式——组合模式

时间:2015-06-17 15:32:55      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:


背景

    很多人学习C语言的时候,都会学习一种很厉害的的算法,递归算法,说实话,递归真的是一个非常厉害的算法,因为它能解决很多意想不到的问题,比如文件夹删除,如果不采用递归,还真不知道要写多少代码呢?关于递归,他总是要一个结束条件,否则就无限循环了,其实这里涉及到结构问题,也就是新的设计模式,组合模式。


1、使用意图

    一致对待整体与部分


2、生活实例

    组织架构关系,整体与部分可以被一致对待


3、Java 例子(框架、JDK 、JEE)

    无论是文件还是文件夹,Java都统一使用类File定义,文件夹是包含文件的,而去他们有着层次关系,所以使用组合模式在适合不过了。组合模式同样缺点是存在的,就是在叶子对象上使用了非叶子方法,如在文件对象中使用了文件夹的方法,程序就会抛异常了,所以调用叶子方法之前需要判断。


4、模式类图

技术分享

  1. 抽象构件接口(Component):定义一个接口,声明原子项所要实现的方法,同时,也是声明组合项中的方法,使二者形成默认的行为。

  2. 叶部件(Leaf):实现抽象构件接口,并且实现叶节点每一个方法的详细操作,此为原子项。

  3. 组合类(Composite):实现抽象构件接口,并且把Leaf对象的集合引用作为自己的成员变量,还定义了一些管理这些Leaf对象的方法(比如addremove等)。实现接口中的方法,这些方法的实现是有规律的,也就是遍历Leaf集合,然后由每一个Leaf对象去执行接口中的方法。

  4. 客户角色(Client):控制Composite组合对象中的Leaf对象。


5、模式优点

    组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

    需求中体现部分与整体的层次关系的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑使用组合模式。

    组合模式让客户可以一致地使用组合结构和单个对象。


6、与类似模式比较

    组合模式中叶子节点与组合节点具有同样的接口,这个的目的是为了保持二者的一致性,让客户觉得二者没有区别,实际上这样也会带来一个问题,那就是叶子节点本不需要的接口也在自身得到实现,这种方式称之为透明方式。当然,如果不采用这种透明方式,现在一种不透明的方式,那么叶子节点和组合节点不具有相同的接口,这时使用起来就需要在客户端进行判断,是在是麻烦。所以,建议使用透明方式。

    这种设计模式很特别,感觉是独一无二的。



小菜学设计模式——组合模式

标签:

原文地址:http://my.oschina.net/heweipo/blog/467743

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!