背景
很多人学习C语言的时候,都会学习一种很厉害的的算法,递归算法,说实话,递归真的是一个非常厉害的算法,因为它能解决很多意想不到的问题,比如文件夹删除,如果不采用递归,还真不知道要写多少代码呢?关于递归,他总是要一个结束条件,否则就无限循环了,其实这里涉及到结构问题,也就是新的设计模式,组合模式。
1、使用意图
一致对待整体与部分
2、生活实例
组织架构关系,整体与部分可以被一致对待
3、Java 例子(框架、JDK 、JEE)
无论是文件还是文件夹,Java都统一使用类File定义,文件夹是包含文件的,而去他们有着层次关系,所以使用组合模式在适合不过了。组合模式同样缺点是存在的,就是在叶子对象上使用了非叶子方法,如在文件对象中使用了文件夹的方法,程序就会抛异常了,所以调用叶子方法之前需要判断。
4、模式类图
- 抽象构件接口(Component):定义一个接口,声明原子项所要实现的方法,同时,也是声明组合项中的方法,使二者形成默认的行为。
- 叶部件(Leaf):实现抽象构件接口,并且实现叶节点每一个方法的详细操作,此为原子项。
- 组合类(Composite):实现抽象构件接口,并且把Leaf对象的集合引用作为自己的成员变量,还定义了一些管理这些Leaf对象的方法(比如add,remove等)。实现接口中的方法,这些方法的实现是有规律的,也就是遍历Leaf集合,然后由每一个Leaf对象去执行接口中的方法。
- 客户角色(Client):控制Composite组合对象中的Leaf对象。
5、模式优点
组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
需求中体现部分与整体的层次关系的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑使用组合模式。
组合模式让客户可以一致地使用组合结构和单个对象。
6、与类似模式比较
组合模式中叶子节点与组合节点具有同样的接口,这个的目的是为了保持二者的一致性,让客户觉得二者没有区别,实际上这样也会带来一个问题,那就是叶子节点本不需要的接口也在自身得到实现,这种方式称之为透明方式。当然,如果不采用这种透明方式,现在一种不透明的方式,那么叶子节点和组合节点不具有相同的接口,这时使用起来就需要在客户端进行判断,是在是麻烦。所以,建议使用透明方式。
这种设计模式很特别,感觉是独一无二的。
时间: 2024-10-10 01:26:03