定义
组合模式允许你将对象组合成树形结构来表现出“整体/部分”层次结构。组合能以一致的方式处理个别对象以及对象组合。
结构图
用户使用Compoment类接口与组合结构中的对象进行交互。如果接受者是一个叶节点,则直接处理请求。如果接受者是Composite,它通常将请求发送给他的子部件,在转发请求之前或者之后可能执行一些辅助操作。
代码示例
component:
leaf:
composite:
client:
测试结果:
该代码用树(此树非数据结构中的树)来示范组合模式。代码较简单,但能清晰的体现组合模式的优点。
深入分析
将客户代码与复杂的对象容器结构解耦是组合模式的核心思想,解耦之后,客户代码将与纯粹的抽象接口——而非对象容器的复内部实现结构——发生依赖关系,从而更能应对变化。
组合模式中必须提供对子对象的管理方法,不然无法完成对子对象的添加删除等等操作,也就失去了灵活性和扩展性。但是管理方法是在Component中就声明还是在Composite中声明呢?一种方式是在Component里面声明所有的用来管理子类对象的方法,以达到Component接口的最大化。目的就是为了使客户看来在接口层次上树叶和分支没有区别——透明性。但树叶是不存在子类的,因此声明的一些方法对于树叶来说是不适用的。这样也就带来了一些安全性问题。另一种方式就是只在Composite里面声明所有的用来管理子类对象的方法。这样就避免了上一种方式的安全性问题,但是由于叶子和分支有不同的接口,所以又失去了透明性。《设计模式》一书认为:在这一模式中,相对于安全性,我们比较强调透明性。对于第一种方式中叶子节点内不需要的方法可以使用空处理或者异常报告的方式来解决。
组合模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率。
要点
-
Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化为“一对一”的关系,使得客户代码可以一致的处理对象和对象容器,无需关心处理的是单个对象,还是组合的对象容器。
将“客户代码与复杂的对象容器结构”解耦是Composite模式的核心思想,解耦之后,客户代码将与纯粹的对象接口——而非对象容器的复杂内部实现结构——发生依赖关系,从而更能“应对变化”。
Composite模式中,是将“Add和Remove的和对象容器相关的方法”定义在“表示抽象对象的Component类”中,还是将其定义在“表示对象容器的Composite类”中,是一个关乎“透明性”和“安全性”的两难问题,需要仔细权衡结构,这又是必须付出的代价。
Composite模式在具体实现中,可以让父对象中的字对象反向追溯:如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率
适用性:
以下情况使用Composite模式:
- 想表示对象的部分-整体层次结构。
- 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
优点:
- 组合模式可以很容易的增加新的构件。
- 使用组合模式可以使客户端变的很容易设计,因为客户端可以对组合和叶节点一视同仁。
缺点:
- 使用组合模式后,控制树枝构件的类型不太容易。
- 用继承的方法来增加新的行为很困难。
在android中的应用
在android中,View类是典型的组合模式。
具体图:
分享到:
相关推荐
android开发应用详解教程,是一本非常不错的电子教程,浅学易懂,适合初学上手学习!
浅学RC充放电电路
浅学电子幸运大转盘知识
此文粗略得介绍了pascal语言,学过初级编程的容易接受
二极管,三极管,PN接
1、XML AJAX: Asynchronous Javascript And Xml 1、什么是XML eXtensible Markup Language 可扩展的 标记 语言 XML的标记没有预定义过,需要自行定义 XML的宗旨是做数据传递的,而非... $xml.="<...>"; ....
由于小编接触Vue比较多,React只是浅学,所以本篇主要针对Vue来展开介绍,带你一步一步搞懂它。 虚拟DOM 什么是虚拟DOM? 虚拟DOM(Virtual Dom),也就是我们常说的虚拟节点,是用JS对象来模拟真实DOM中的节点,...
(6)反思:其实这个系统非常非常的不完善,由于我数据库当时学的不太行,sqlite存储中文不太会搞,所以把那五本图书的信息直接存储在数组中了,每次打开调用一下,其实这是非常不友好的处理方式,如果图书的内容...
1. 这个是git上朋友发的,我这就是蹭蹭人家流量了 2. 是一个时序预测的问题的数据集 3. 每个小时一个数据,每个batch训练的数据是前一周也就是196个小时,预测的结果是下一天的数据24小时
对字节序的一些理解。
这里就是通过布局文件中Button控件的属性值onClick=”click”实行回调函数click,代表着点击按钮有click方法响应。 回调函数代码如下,首先要通过id找到对应的按钮 myBtn_one.findViewById(R.id.btn_one); 要实现...
一份相当不错的Java大学基础教程 课件中还附有源代码,浅学易懂。
白话云计算 近年来,云计算技术广为热议,各种应用也不断涌现,并逐步改变着我们的生活、工 作方式,我国和英、美等发达国家一样,业已将云计算技术研发和应用上升为国家战略 ,新一轮技术革命的号角已然响起。...
非常好的教程,浅学易懂,主要是基于centos的讲解
C语言上机归类,这个是浅学C语言的好资料,不过对付计算机二级C的编程部分的考试也是错错有余的。
基于Huffman编码思路的一个测试性压缩工具,但是由于个人水平原因(浅学的业余爱好者),并没有利用到Huffman编码的树状结构特点。另,由于快开学了......so,bug还没来得及修复,开学后有时间我会再打磨一下,另,...
oclhashcat.zip
我的选课建议和升学经验 .pages