- 浏览: 1681135 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 736简介 在之前的文章里我们讨论过一些程序构建Pro ... -
java annotation基础
2018-06-30 16:41 883简介 之前有一篇简短的文章讨论过annotati ... -
spring源代码分析:annotation支持的实现
2018-09-03 23:31 2547简介 在之前的文章里,我们讨论了spring I ... -
spring container 实现分析:BeanFactory and ApplicationContext
2018-06-02 18:29 1465简介 在之前的文章里,我们讨论过作为spring ... -
spring aop: ProxyFactory
2018-04-30 16:45 837简介 在之前的文 ... -
日志与log4j2的配置和应用总结
2018-02-15 15:47 12310简介 通常我们在日常的应用开发中,日志起到一个非 ... -
Java servlet学习总结
2018-01-02 21:14 0简介 应用系统架构的演化(从CS到BS) ... -
spring container 实现分析:BeanWrapper
2018-02-19 18:10 1981简介 在之前的一篇文章里, 我们基于《Exper ... -
spring propertyeditor
2017-10-26 09:17 0pro spring 5 chapter 4, page ... -
spring bean life cycle
2018-02-25 13:30 923简介 在使用spring bean的过程中,有一个 ... -
spring container的设计与实现分析
2017-10-08 21:31 2766简介 在之前的一 ... -
jdbc数据访问的封装和演化
2017-09-16 17:00 2688简介 在使用传统jdbc的方式来访问数据的时候, ... -
Boyer Moore算法分析总结
2017-03-31 18:42 3552简介 在之前的文章里,对于字符串的搜索算法,我曾 ... -
mybatis学习总结:mybatis和spring, spring boot的集成
2017-03-04 18:07 2508简介 在前面的讨论里已经提到了mybatis的各种配置 ... -
mybatis学习总结:annotation与xml结合示例
2017-02-25 21:09 3699简介 在之前的文章里讨论过mybatis纯xml或者 ... -
mybatis学习总结:对象关系映射的xml配置实现
2017-02-19 23:03 4064简介 在之前的文章里已经讨论过mybatis的基本配 ... -
mybatis学习总结:annotation示例改进
2017-01-24 09:06 3436简介 在前一篇文 ... -
mybatis学习总结:基础示例
2017-01-21 23:30 895简介 mybatis是一个比较流行的ORM框架, ... -
gradle学习总结
2016-12-18 21:01 4626简介 Java的自动化构建工具比较多,从最开始的an ... -
String sort的几种方法
2016-10-16 23:07 2183简介 在之前的一 ...
相关推荐
例如,`Composite Pattern.oob`可能展示了Component、Composite和Leaf类的关系,而`Composite Pattern.oom`可能包含了一些示例对象的实例,展示如何通过组合模式构建树形结构并执行操作。 **使用和优势** 组合模式...
**组合模式**(Composite Pattern)是一种常用的结构型设计模式,主要用于构建具有层次结构的对象系统。它允许客户端以一致的方式处理单个对象和组合对象,简化了高层模块的调用。通过组合模式,可以将多个对象组织成...
组合模式是一种行为设计模式,属于面向对象设计中的结构型模式,其主要目的是为了建立一种对象树形结构,这种结构能够使客户端代码以统一的方式处理单个对象和对象的组合。在组合模式中,我们通常会定义一个基类,...
组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分-整体层次关系,使得客户端代码可以统一地处理单个...通过学习和理解"CompositePattern.rar"中的示例,你可以深入了解如何在实际项目中应用这一模式。
组合模式(Composite Pattern)是一种对象结构型模式,其定义是将多个对象组合成树形结构以表示“整体-部分”关系的层次结构。它使得客户端对单个对象和组合对象的使用具有一致性。在组合模式中,对象被组织成树形...
组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端可以以统一的方式对待单个对象和组合对象,这种模式常用于需要处理树形结构的数据...
**设计模式面面观:组合模式(Composite Pattern)** 组合模式是软件工程中的一种结构型设计模式,它允许我们以树形结构来表示部分与整体的关系,使得客户端代码可以一致地处理单个对象和对象组合。在组合模式中,...
迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)是设计模式中的两种重要结构型模式,它们在软件设计中有着广泛的应用。这两种模式都属于GoF(Gang of Four)设计模式,旨在解决特定的问题,提升代码...
【C#复合模式(Composite Pattern)实例教程】 复合模式是一种设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。复合模式使得客户端代码能够一致地处理单个对象和对象组合,也就是说,客户端...
**复合模式(Composite Pattern)**是一种结构型设计模式,它允许我们构建复杂的对象结构,并能像操作单个对象一样处理整个结构。在计算机科学中,这种模式尤其适用于表示部分-整体层次结构,使得用户可以一致地处理...
组合模式(Composite Pattern),是软件工程设计模式中的一种,属于结构型模式。这种模式将对象组织成树形结构,使得客户端可以统一地处理单个对象和对象组合,展现出“部分-整体”的层次结构。在VC++编程中,理解并...
Composite模式使得用户对单个对象和组合对象的使用具有一致性。[GOF《设计模式》]图1Composite模式结构图组合模式将对象组合成树形结构以表示"部分-整体"的层次结构。让用户一致地使用单个对象和组合对象。虽然例子...
组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分与整体的关系,使得客户端可以统一地处理单个对象和对象集合。在Objective-C编程中,这种模式尤其有用,因为它提供了对对象集合进行递归操作的能力...
在`CompositePattern.cpp`和`CompositePattern.h`文件中,我们可以预期看到如下内容: - `CompositePattern.h`文件应该包含了`Component`、`Composite`和具体叶子节点类的声明,定义了它们的接口。 - `Composite...
**复合模式(Composite Pattern)** 复合模式是一种结构型设计模式,它允许你将对象组织成树形结构,表现得像单个对象一样。在复合模式中,你可以对单个对象和对象组合进行相同的操作,无需关心你正在处理的是单个对象...
9. 组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 10. 装饰器模式(Decorator Pattern):动态地给一个对象添加...
桥接模式-Bridge Pattern 处理多维度变化——桥接模式(一) 处理多维度变化——桥接模式(二) 处理多维度变化——桥接模式(三) 处理多维度变化——桥接模式(四) 组合模式-Composite Pattern 树形结构的处理...
合成模式以树结构的形式构成对象,以表示部分以及整个层次结构。 这种设计模式属于结构模式,因为该模式创建了一组对象的树形结构。 此模式创建一个包含其自己的对象组的类。 此类提供了修改其相同对象组的方法。 ...