`
frank-liu
  • 浏览: 1681103 次
  • 性别: 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.oob`可能展示了Component、Composite和Leaf类的关系,而`Composite Pattern.oom`可能包含了一些示例对象的实例,展示如何通过组合模式构建树形结构并执行操作。 **使用和优势** 组合模式...

    组合模式 Composite Pattern

    **组合模式**(Composite Pattern)是一种常用的结构型设计模式,主要用于构建具有层次结构的对象系统。它允许客户端以一致的方式处理单个对象和组合对象,简化了高层模块的调用。通过组合模式,可以将多个对象组织成...

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

    组合模式是一种行为设计模式,属于面向对象设计中的结构型模式,其主要目的是为了建立一种对象树形结构,这种结构能够使客户端代码以统一的方式处理单个对象和对象的组合。在组合模式中,我们通常会定义一个基类,...

    CompositePattern.rar

    组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分-整体层次关系,使得客户端代码可以统一地处理单个...通过学习和理解"CompositePattern.rar"中的示例,你可以深入了解如何在实际项目中应用这一模式。

    组合模式(Composite Pattern)原理图

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

    c++-设计模式之组合模式(Composite Pattern)

    组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端可以以统一的方式对待单个对象和组合对象,这种模式常用于需要处理树形结构的数据...

    设计模式面面观(11):组合模式(Composite Pattern)-结构型模式

    **设计模式面面观:组合模式(Composite Pattern)** 组合模式是软件工程中的一种结构型设计模式,它允许我们以树形结构来表示部分与整体的关系,使得客户端代码可以一致地处理单个对象和对象组合。在组合模式中,...

    Head First 设计模式 (九) 迭代器与组合模式(Iterator & Composite pattern) C++实现

    迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)是设计模式中的两种重要结构型模式,它们在软件设计中有着广泛的应用。这两种模式都属于GoF(Gang of Four)设计模式,旨在解决特定的问题,提升代码...

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

    【C#复合模式(Composite Pattern)实例教程】 复合模式是一种设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。复合模式使得客户端代码能够一致地处理单个对象和对象组合,也就是说,客户端...

    Composite模式

    **复合模式(Composite Pattern)**是一种结构型设计模式,它允许我们构建复杂的对象结构,并能像操作单个对象一样处理整个结构。在计算机科学中,这种模式尤其适用于表示部分-整体层次结构,使得用户可以一致地处理...

    Composite.rar

    组合模式(Composite Pattern),是软件工程设计模式中的一种,属于结构型模式。这种模式将对象组织成树形结构,使得客户端可以统一地处理单个对象和对象组合,展现出“部分-整体”的层次结构。在VC++编程中,理解并...

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

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

    CompositePattern:设计模式之组合模式

    组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分与整体的关系,使得客户端可以统一地处理单个对象和对象集合。在Objective-C编程中,这种模式尤其有用,因为它提供了对对象集合进行递归操作的能力...

    [结构型模式] 组合模式的理解

    在`CompositePattern.cpp`和`CompositePattern.h`文件中,我们可以预期看到如下内容: - `CompositePattern.h`文件应该包含了`Component`、`Composite`和具体叶子节点类的声明,定义了它们的接口。 - `Composite...

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

    **复合模式(Composite Pattern)** 复合模式是一种结构型设计模式,它允许你将对象组织成树形结构,表现得像单个对象一样。在复合模式中,你可以对单个对象和对象组合进行相同的操作,无需关心你正在处理的是单个对象...

    design pattern tutorial

    9. 组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 10. 装饰器模式(Decorator Pattern):动态地给一个对象添加...

    design-pattern-java.pdf

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

    CompositePattern:复合设计模式示例

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

Global site tag (gtag.js) - Google Analytics