`
frank-liu
  • 浏览: 1665650 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Composite pattern和树

 
阅读更多

一切从,那一段代码开始的

     开始我们考虑这样一个问题,就是假定我们要写一个方法来遍历一个目录里所有的文件。因为目录里面可能还含有子目录,我们可能就需要用到循环,递归等这样的思路。一个典型的思路如下:

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

这个类图中间最取巧的一点就在于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类就没有定义任何继承。

  • 大小: 75.3 KB
  • 大小: 63.8 KB
分享到:
评论

相关推荐

    组合模式 Composite Pattern

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的...

    设计模式之组合模式(Composite Pattern)

    将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。

    组合模式(Composite Pattern)原理图

    组合模式(Composite Pattern)是一种对象结构型模式,其定义是将多个对象组合成树形结构以表示“整体-部分”关系的层次结构。它使得客户端对单个对象和组合对象的使用具有一致性。在组合模式中,对象被组织成树形...

    C#复合模式(Composite Pattern)实例教程

    主要介绍了C#复合模式(Composite Pattern),以实例形式讲述了复合模式在树形结构中的应用,需要的朋友可以参考下

    .NET设计模式(11):组合模式(CompositePattern)

    Composite模式使得用户对单个对象和组合对象的使用具有一致性。[GOF《设计模式》]图1Composite模式结构图组合模式将对象组合成树形结构以表示"部分-整体"的层次结构。让用户一致地使用单个对象和组合对象。虽然例子...

    design-pattern-java.pdf

    桥接模式-Bridge Pattern 处理多维度变化——桥接模式(一) 处理多维度变化——桥接模式(二) 处理多维度变化——桥接模式(三) 处理多维度变化——桥接模式(四) 组合模式-Composite Pattern 树形结构的处理...

    CompositePattern:复合设计模式示例

    合成模式以树结构的形式构成对象,以表示部分以及整个层次结构。 这种设计模式属于结构模式,因为该模式创建了一组对象的树形结构。 此模式创建一个包含其自己的对象组的类。 此类提供了修改其相同对象组的方法。 ...

    visitor-composite-patterns-combined:复合和访客设计模式示例

    访客和复合设计模式示例 这是一个简单的Java应用程序,演示了组合使用Composite和Visitor模式的组合。 我们首先使用复合模式创建树结构菜单,然后使用访问者模式遍历树。

    设计模式_组合模式.zip

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的...

    lab-03---composite-pattern-jiir

    表达式树是等式的树表示,因此表达式3 + 7 * 4 - 2将用以下表达式树表示 每个操作及其操作数的深度均基于其优先级,优先级最高的操作位于树的最低级别。 要执行的第一个表达式(在这种情况下为7 * 4 )将位于最深层...

    intro-to-software-construction-composite-pattern

    表达式树是等式的树表示,因此表达式 3 + 7 * 4 - 2 将用以下表达式树表示 每个操作及其操作数的深度均基于其优先级,优先级最高的操作位于树的最低级别。 要执行的第一个表达式(在这种情况下为7 * 4 )将位于最...

    Python设计模式之组合模式原理与用法实例分析

    组合模式(Composite Pattern):将对象组合成成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 下面是一个组合模式的demo: #!/usr/bin/env python # -*- coding:utf...

    IOS设计模式之组合设计模式

    组合模式,Composite Pattern,是一个非常巧妙的模式。几乎所有的面向对象系统都应用到了组合模式。 通过本文将让你学会软件开发中的”何为树形结构”、”何为组合模式”、”组合模式可以解决的问题”等相关知识。 ...

    Android设计模式系列之组合模式

    组合模式,Composite Pattern,是一个非常巧妙的模式。几乎所有的面向对象系统都应用到了组合模式。 1.意图 将对象View和ViewGroup组合成树形结构以表示”部分-整体”的层次结构(View可以做为ViewGroup的一部分)。 ...

    java 设计模式资料

    Composite:将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。 Decorator:动态地给一个对象添加一些额外的职责。就扩展功能而言, 它比生成子类方式更为...

    二十三种设计模式【PDF版】

    设计模式之 Composite(组合) 就是将类用树形结构组合成一个单位.你向别人介绍你是某单位,你是单位中的一个元素,别人和你做买卖,相当于 和单位做买卖。文章中还对 Jive再进行了剖析。 设计模式之 Decorator(装饰...

    asp.net知识库

    动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...

    java 面试题 总结

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

Global site tag (gtag.js) - Google Analytics