文档章节

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

learn_more
 learn_more
发布于 2015/06/17 13:11
字数 897
阅读 340
收藏 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
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
加载中
请先登录后再评论。
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.5K
16
Javascript图元绘制库--ternlight

基于HTML CANVAS API的Javascript库,提供在HTML页面上绘制图元——如流程图的能力。 目前已支持简单的矩形图元和图元间的连线(直线、直角连线两种),拖拽图元等能力。 该javascript librar...

fancimage1
2013/02/07
6.3K
1
实时分析系统--istatd

istatd是IMVU公司工程师开发的一款优秀的实时分析系统,能够有效地收集,存储和搜索各种分析指标,类似cacti,Graphite,Zabbix等系统。实际上,istatd修改了Graphite的存储后端,重新实现了...

匿名
2013/02/07
3K
1
图形化的 IDE--LiveCode

LiveCode是一个图形化的IDE,允许用户通过拖放控件并编写代码,来创建桌面或移动应用程序(支持Windows、Mac OS、Linux、iOS和Android平台)。LiveCode受苹果HyperCard的启发,采用一种基于英...

匿名
2013/04/12
7.2K
0
diff程序--dwdiff

dwdiff是一个diff程序,运行在单词级别而不是行级别。它不同于wdiff,它允许用户指定应该考虑空白,它需要一个可选的字符列表,应该被视为 分隔符。分隔符是单字符被当作有话说,即使没有空格分开...

匿名
2012/11/04
550
0

没有更多内容

加载失败,请刷新页面

加载更多

android 获取mac地址

android获取Mac地址的两种方式,适用于6.0版本以下 public static String tryGetWifiMac(Context context) { WifiManager wm = (WifiManager) context.getApplicationContext().getSyst......

osc_8cqhsn24
18分钟前
0
0
阿里HR: 你会 Android 实现侧滑菜单-design吗? CN看了,原来这么简单呀!

google提供的Design开发包里,有很多实用好看的新控件,这里介绍下使用DrawerLayout+NavigationView实现侧滑菜单效果 要使用Design包,只要在项目的build.gradle中添加下依赖就好(记得更新S...

osc_evac23lh
20分钟前
0
0
IOS开发控件视图day15:UIPageControl设置定时器自动翻页,以及更改小圆点背景图片

.h文件 @property(nonatomic,strong)UIScrollView *scrollView0;@property (strong, nonatomic) UIPageControl *pageControl0;@property (nonatomic,strong) NSTimer *nstime; .m文件(具......

osc_494omtst
20分钟前
0
0
Codeforces Round #663 (Div. 2) (CD)

C. Cyclic Permutations 思路:全排列减去单峰排列即为答案。 单峰排列即:峰左边下标的左边没有比它大的,峰右边的下标的右边没有比它大的。 单峰排列个数: 2 n − 1 2^{n-1} 2n−1,除 n ...

osc_gh0ost1g
22分钟前
0
0
Python Pandas面试题及答案

Pandas是一个开源库,可在Python中提供高性能的数据处理。 Pandas这个名称源自“面板数据”一词,这表示来自多维数据的计量经济学。 它可用于Python中的数据分析,并由Wes McKinney在2008年开...

程序员面试吧
22分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部