文档章节

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

learn_more
 learn_more
发布于 2015/06/17 13:11
字数 897
阅读 258
收藏 5

背景

    很多人学习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、与类似模式比较

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

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



© 著作权归作者所有

共有 人打赏支持
learn_more
粉丝 92
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
迈向大牛的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后,大牛只需潇洒地敲敲键...

一枚Sir
2015/04/10
0
0
小菜学设计模式——设计模式总结之结构型

1、设计模式总结 设计模式总共23个,但是常用的不到10个,下面就把这23个设计模式进行整理归类,具体如下: 1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型...

learn_more
2015/07/06
0
0
Java 设计模式(14) —— 复合模式

一、复合模式 模式常一起使用,组合在一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式,能解决一般性或一系列的问题 二、示例 本次设计模式讲解中无代码示例,由于复合模式是...

磊_lei
05/26
0
0
小菜学设计模式——设计模式总结之创建型

1、面向过程与面向对象 1)面向过程通过划分功能模块,通过函数间相互调用来实现,但需求变化时就需要更改函数,而你改动的函数有多少地方在调用她呢?关联多少数据,这是很不容易弄得清楚地...

learn_more
2015/07/05
0
0
小菜学设计模式——工厂方法模式

背景 简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关类,对于客户端来说,去除了与具体产品的依赖。如果,项目需要扩展,新增一种产品需要简...

learn_more
2015/06/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL 数据库中间件 MyCAT 基础解析

前言 网络应用持续扩张的过程中,为了处理海量数据往往首先遇到的挑战就是数据存储的扩展 数据存储的扩展一般以切分来实现,切分的技术实现又可分为垂直切分和水平切分: 以表(或Schema)为切...

PeakFang-BOK
30分钟前
0
0
Linux Mysql 安装

https://www.cnblogs.com/xinjing-jingxin/p/8025805.html

流氓兔-
56分钟前
0
0
GlusterFS强制删除节点

GlusterFS中,修改了节点名称,导致找不到了,想删除掉重新加入。 没想到,gluster peer detach server02方法失败,竟然用了各种方法都删除不掉,提示节点无效(废话!有效的我还要删除么?!...

openthings
今天
2
0
光纤技术取得突破,互联网速度或可提高100倍

据外媒报道,近日发表在《自然通讯》上的一篇文章称,通过检测扭曲成螺旋状的光线,互联网速度可以提高 100 倍。这项研究可用于轻松升级现有的网络,大幅提高传输效率。 光纤线缆使用光脉冲来...

linux-tao
今天
1
0
day150-2018-11-17-英语流利阅读-待学习

歪果仁也疯狂:海外版抖音的征途 毛西 2018-11-17 1.今日导读 海外版抖音 TikTok 于 2017 年 5 月上线海外,至今覆盖全球 150 多个国家和地区,月活跃用户数已突破 5 亿。然而,“出海”的抖...

飞鱼说编程
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部