- 浏览: 1665650 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (335)
- uml (11)
- java (318)
- python (11)
- socket (2)
- ant (1)
- data structures (58)
- algorithms (67)
- concurrency (16)
- multithreading (16)
- mysql (2)
- ubuntu (2)
- c语言 (1)
- lucene (0)
- elasticsearch (0)
- django (1)
- 读书 观点 (2)
- 读书 (4)
- 观点 (4)
- collections (8)
- nio (1)
- io (2)
- 系统集成 (1)
- activemq (2)
- restful (0)
- web service (0)
- HttpClient (1)
- serializable (0)
- annotation (1)
- jdbc (3)
- classloader (0)
- regular expression (1)
- jpa (4)
- jvm (0)
- reflection (1)
- commons-pool2 (2)
- javamail (1)
- velocity (1)
- mathematics (3)
- graph (13)
- LeetCode (159)
- scala (0)
- spring (24)
- maven (5)
- spring batch (1)
- quartz (2)
- IOC (2)
- ORM (3)
- hibernate (2)
- aop (4)
- redis (0)
- zookeeper (0)
- spring mvc (4)
- ELK (1)
- string (1)
- gradle (1)
- mybatis (5)
- docker (0)
- servlet (0)
- log4j2 (1)
- html (0)
- css (0)
最新评论
-
nucleus:
貌似是因为图片的路径是http的缘故:http://dl2.i ...
spring container 实现分析:BeanWrapper -
nucleus:
nucleus 写道BeanWrapper这一块相关的类结构如 ...
spring container 实现分析:BeanWrapper -
nucleus:
BeanWrapper这一块相关的类结构如下图:文中提到的上述 ...
spring container 实现分析:BeanWrapper -
leshy:
inventory.sort(Comparator.compa ...
java8 lambda表达式学习总结 -
Leisurez:
di1984HIT 写道xuexile~hahaha~
activemq的几种基本通信方式总结
一切从,那一段代码开始的
开始我们考虑这样一个问题,就是假定我们要写一个方法来遍历一个目录里所有的文件。因为目录里面可能还含有子目录,我们可能就需要用到循环,递归等这样的思路。一个典型的思路如下:
1. 首先列出该文件夹里所有内容。
2. 遍历里面所有的元素,如果该元素为纯文件,则显示文件名;否则,则递归调用该函数。
按照以上的思路,可以写出如下的一段简单的代码:
void listDirectory(String directory) { File dir = new File(directory); for(File file : dir.listFiles()) { if(!file.isDirectory()) System.out.println(flie.getName()); else listDirectory(file.getAbsolutePath()); } }
换个角度看问题
前面那个问题的解决思路其实是基于这么一点。我们要遍历一个目录结构,因为目录里面可以有子目录和文件,从我们学习过的书本知识可以知道,这是一个树的结构。所以,我们可以通过这么一种递归的方式来访问所有的元素。因为是树,如果利用一些数据结构的知识,还可以整理出各种遍历元素的方法。这种思路也没什么不好的,现在,我们再换一种思路去想想。
我们要访问的目录可以说是一个容器,它里面可以包含子容器和一些元素。这些子容器呢,也可以包含更下面一级的子容器以及元素,于是乎,子子孙孙无穷匮也...再从这个思路做进一步的延伸,也就是说,我们需要设计一个结构,这个结构可以包含它自身这种类型以及它的单个元素类型。最关键的一点就是,假定我是一个容器,我里面的元素可以是一层一层套的。于是这就引出了这么一种设计,composite pattern.
我们先看看它的类图:
这个类图中间最取巧的一点就在于Composite这个类和Component类之间的关系。Composite首先和它有一个继承关系。另外一个Leaf类和Component也是同样的继承关系。另外,Composite与Component有一个可能的1对多的聚合或者组合关系。这意味着我一个Composite类可以包含有多个Component对象。因为前面提到的继承关系,所以我包含的可以是具体的Leaf对象,也可以是Composite对象。看到没?在这里,我们就引出了一个Composite可以包含有Composite关系的设计来了。和前面提到的我们一个目录可以包含另外一个目录,或者一个容器包含另外一个容器的说法是不是一样的呢?
牵一发而动全身
实际上,如果我们可以对目录和文件做建模的话,可以做一个类似与如下的设计。我们可以定义一个抽象的File类,然后定义具体的ConcreteFile和Directory类来继承它。借鉴Composite pattern的思路,可以设计成如下图:
这个设计的具体实现代码就不赘述,其中的关节点就在于Composite类里面对displayName方法的实现。因为是一个组合类,它这个方法的实现方式类似如下:
public void displayName() { for(File file : getChild()) file.displayName(); }
它相当于将自己的方法又委托给自己的子元素了。
这种手法还有一个好处就是,当我们使用的时候,似乎只是针对一个File对象调用了displayName的方法,实际上它内部是针对所有的元素作了遍历的,可谓牵一发而动全身。
两种思路的区别
我们现在回过头来看前面两种遍历的思路。其实第一种是将树中间的元素作了区分,需要在代码里判断是否为目录,如果为普通文件则显示名字,否则就要递归调用。至少在代码里,我们是需要用if else这样的代码来做个区分的。而第二种思路由于通过继承,我们可以说处理的都是Component,利用面向对象的特性,不需要用if else来判断了。从使用的角度来说看起来composite和leaf之间是相互可替换的。因为他们从component这个角度来说是一样的。
和Decorator Pattern之间的相似点以及区别
如果我们前面看到过Decorator pattern的话,第一感觉会觉得他们两个模式之间关系比较密切,看起来差别不大。下面是decorator pattern的类图:
其实,他们的差别主要在一下几个方面:
1:Decorator pattern主要是针对一个对象进行多重包装,所以其中的decorator和component之间基本上是1对1的关系。而composite pattern主要是体现出一个1对多的关系,更多的体现出层级的结构化。
2: Decorator pattern需要对一个decorator来继承出若干包装类,而composite不体现出要在原有元素的基础上进行什么特性的修改或增强,只是一个纯粹的对象组合,所以它的composite类就没有定义任何继承。
发表评论
-
spring源代码分析:aop的实现
2018-10-03 23:32 686简介 在之前的文章里我们讨论过一些程序构建Pro ... -
java annotation基础
2018-06-30 16:41 833简介 之前有一篇简短的文章讨论过annotati ... -
spring源代码分析:annotation支持的实现
2018-09-03 23:31 2454简介 在之前的文章里,我们讨论了spring I ... -
spring container 实现分析:BeanFactory and ApplicationContext
2018-06-02 18:29 1399简介 在之前的文章里,我们讨论过作为spring ... -
spring aop: ProxyFactory
2018-04-30 16:45 782简介 在之前的文 ... -
日志与log4j2的配置和应用总结
2018-02-15 15:47 12187简介 通常我们在日常的应用开发中,日志起到一个非 ... -
Java servlet学习总结
2018-01-02 21:14 0简介 应用系统架构的演化(从CS到BS) ... -
spring container 实现分析:BeanWrapper
2018-02-19 18:10 1853简介 在之前的一篇文章里, 我们基于《Exper ... -
spring propertyeditor
2017-10-26 09:17 0pro spring 5 chapter 4, page ... -
spring bean life cycle
2018-02-25 13:30 868简介 在使用spring bean的过程中,有一个 ... -
spring container的设计与实现分析
2017-10-08 21:31 2649简介 在之前的一 ... -
jdbc数据访问的封装和演化
2017-09-16 17:00 2593简介 在使用传统jdbc的方式来访问数据的时候, ... -
Boyer Moore算法分析总结
2017-03-31 18:42 3477简介 在之前的文章里,对于字符串的搜索算法,我曾 ... -
mybatis学习总结:mybatis和spring, spring boot的集成
2017-03-04 18:07 2458简介 在前面的讨论里已经提到了mybatis的各种配置 ... -
mybatis学习总结:annotation与xml结合示例
2017-02-25 21:09 3644简介 在之前的文章里讨论过mybatis纯xml或者 ... -
mybatis学习总结:对象关系映射的xml配置实现
2017-02-19 23:03 4003简介 在之前的文章里已经讨论过mybatis的基本配 ... -
mybatis学习总结:annotation示例改进
2017-01-24 09:06 3383简介 在前一篇文 ... -
mybatis学习总结:基础示例
2017-01-21 23:30 839简介 mybatis是一个比较流行的ORM框架, ... -
gradle学习总结
2016-12-18 21:01 4525简介 Java的自动化构建工具比较多,从最开始的an ... -
String sort的几种方法
2016-10-16 23:07 2109简介 在之前的一 ...
相关推荐
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的...
将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。
组合模式(Composite Pattern)是一种对象结构型模式,其定义是将多个对象组合成树形结构以表示“整体-部分”关系的层次结构。它使得客户端对单个对象和组合对象的使用具有一致性。在组合模式中,对象被组织成树形...
主要介绍了C#复合模式(Composite Pattern),以实例形式讲述了复合模式在树形结构中的应用,需要的朋友可以参考下
Composite模式使得用户对单个对象和组合对象的使用具有一致性。[GOF《设计模式》]图1Composite模式结构图组合模式将对象组合成树形结构以表示"部分-整体"的层次结构。让用户一致地使用单个对象和组合对象。虽然例子...
桥接模式-Bridge Pattern 处理多维度变化——桥接模式(一) 处理多维度变化——桥接模式(二) 处理多维度变化——桥接模式(三) 处理多维度变化——桥接模式(四) 组合模式-Composite Pattern 树形结构的处理...
合成模式以树结构的形式构成对象,以表示部分以及整个层次结构。 这种设计模式属于结构模式,因为该模式创建了一组对象的树形结构。 此模式创建一个包含其自己的对象组的类。 此类提供了修改其相同对象组的方法。 ...
访客和复合设计模式示例 这是一个简单的Java应用程序,演示了组合使用Composite和Visitor模式的组合。 我们首先使用复合模式创建树结构菜单,然后使用访问者模式遍历树。
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的...
表达式树是等式的树表示,因此表达式3 + 7 * 4 - 2将用以下表达式树表示 每个操作及其操作数的深度均基于其优先级,优先级最高的操作位于树的最低级别。 要执行的第一个表达式(在这种情况下为7 * 4 )将位于最深层...
表达式树是等式的树表示,因此表达式 3 + 7 * 4 - 2 将用以下表达式树表示 每个操作及其操作数的深度均基于其优先级,优先级最高的操作位于树的最低级别。 要执行的第一个表达式(在这种情况下为7 * 4 )将位于最...
组合模式(Composite Pattern):将对象组合成成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 下面是一个组合模式的demo: #!/usr/bin/env python # -*- coding:utf...
组合模式,Composite Pattern,是一个非常巧妙的模式。几乎所有的面向对象系统都应用到了组合模式。 通过本文将让你学会软件开发中的”何为树形结构”、”何为组合模式”、”组合模式可以解决的问题”等相关知识。 ...
组合模式,Composite Pattern,是一个非常巧妙的模式。几乎所有的面向对象系统都应用到了组合模式。 1.意图 将对象View和ViewGroup组合成树形结构以表示”部分-整体”的层次结构(View可以做为ViewGroup的一部分)。 ...
Composite:将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。 Decorator:动态地给一个对象添加一些额外的职责。就扩展功能而言, 它比生成子类方式更为...
设计模式之 Composite(组合) 就是将类用树形结构组合成一个单位.你向别人介绍你是某单位,你是单位中的一个元素,别人和你做买卖,相当于 和单位做买卖。文章中还对 Jive再进行了剖析。 设计模式之 Decorator(装饰...
动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...
引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...