`
qzriso
  • 浏览: 244298 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

设计模式之组合模式

阅读更多

Composite 组合模式主要是应对这 样的问题:一类具有“容器特征”的对象——即他们在充当对象的同时,又是其他对象的容器的情况。在编写时我们常常会造成:客户代码过多地依赖于对象容器复 杂的内部实现,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性的弊端。

        GoF 《设计模式》中说到:将对象组合成树形结构以表示“部分 - 整体”的层次结构。 Composite 模式使得客户对单个对象和组合对象的使用具有一致性。

        Composite 组合模式结构如下:

 



       
说道这,我觉得有一个编程中常见的场景,就是对于树的实现,很符合这个模式。下面我就用这个例子作一下。

        首先,我们先分析对于一棵树所包含的部分,树干、树枝、树叶,其中树干可以看成一个树枝(就是粗了点)。那么我们就应该有两种类实现 Leaf (树叶)和 Limb (树枝)。对于叶子节点和枝节点的不同在于枝节点有子树,而叶子节点没有子树。为了使单个对象和组合对象的使用具有一致性,我可以将叶子节点想象成没有子树的枝节点。这样我就可以得到一个抽象类,代码如下:

        public  abstract  class  AbstractClass

     {

         public  string  name;

         public  ArrayList list;

         public  abstract  void  Add(AbstractClass item);        // 增加一个子节点

         public  abstract  void  Remove(AbstractClass item);     // 去掉一个子节点

         public  abstract  string  Print();                      // 打印当前节点

     }

        然后,我在对叶子节点和枝节点作不同的实现:

        枝节点:

        public  class  Limb:AbstractClass

     {

         public  Limb()

         {

             list = new  ArrayList();

         }

 

         public  override  void  Add(AbstractClass item)

         {

             list.Add(item);

         }

 

         public  override  void  Remove(AbstractClass item)

         {

             if (list.Contains(item))

                 list.Remove(item);

         }

         public  override  string  Print()

         {

             Console.Write(name + "\n" );

             if (list.Count != 0)

             {

                 for (int  i = 0;i<list.Count;i++)

                 {

                     Console.Write("(Parent is "  + name + ")" );

                     ((AbstractClass)list[i]).Print();

                 }

             }

             return  name;

         }

 

     }

     叶子节点:

     public  class  Leaf:AbstractClass

     {

         public  Leaf()

         {

             list = null ;

         }

 

         public  override  void  Add(AbstractClass item)

         {

 

         }

         public  override  void  Remove(AbstractClass item)

         {

           

         }

         public  override  string  Print()

         {

             Console.Write(name + "," );

             return  this .name;

         }

     }

     对于叶子节点来说,不需要子节点,当然也就不需要添加和删除子节点的方法。

     好,接下来,我们可以在客户程序中组建一棵树,来测试一下:

         static  void  Main(string [] args)

         {

             AbstractClass Tree = new  Limb();

             GetTree(Tree);

             PrintTree(Tree);

             Console.Read();

         }

 

          public  static  void  GetTree(AbstractClass Tree)

         {

             Tree.name = "1" ;

             AbstractClass leaf2 = new  Leaf();

             leaf2.name = "2" ;

             Tree.Add(leaf2);

             AbstractClass limb3 = new  Limb();

             limb3.name = "3" ;

             Tree.Add(limb3);

             AbstractClass leaf4 = new  Leaf();

             leaf4.name = "4" ;

             limb3.Add(leaf4);

             AbstractClass leaf5 = new  Leaf();

             leaf5.name = "5" ;

             limb3.Add(leaf5);

         }

 

         public  static  void  PrintTree(AbstractClass Tree)

         {

             Tree.Print();

         }

     输出结果如下:

1

(Parent is 1)2,(Parent is 1)3

(Parent is 3)4,(Parent is 3)5,

在组织这个树时,的确能感觉到 GoF 《设计模式》中的那句话: 单个对象和组合对象的使用具有一致性。当然也的确感觉到一点矛盾:对于叶子节点来说,不需要 ArrayList Add () Remove ()应该不继承才对,当然如果在代码执行性能可以达到要求的情况下,简化一下编码实现复杂度也是挺好的一件事。

最后在来说说 Composite 组合模式的几个要点:

        1 Composite 模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化为“一对一”的关系,使得客户代码可以一致的处理对象和对象容器,无需关心处理的是单个对象,还是组合的对象容器。

2 、将“客户代码与复杂的对象容器结构”解耦是 Composite 模式的核心思想,解耦之后,客户代码将与纯粹的对象接口——而非对象容器的复杂内部实现结构——发生依赖关系,从而更能“应对变化”。

3 Composite 模式中,是将“ Add Remove 的和对象容器相关的方法”定义在“表示抽象对象的 Component 类”中,还是将其定义在“表示对象容器的 Composite 类”中,是一个关乎“透明性”和“安全性”的两难问题,需要仔细权衡结构,这又是必须付出的代价。

4 Composite 模式在具体实现中,可以让父对象中的字对象反向追溯:如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率

分享到:
评论

相关推荐

    Java设计模式之组合模式

    ### Java设计模式之组合模式详解 #### 定义与动机 组合模式,也称为部分-整体模式,是一种结构型设计模式,它允许我们构建复杂的层级结构,并以一致的方式处理单个对象和组合对象。组合模式的主要动机是创建一个树...

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

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

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

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

    23钟设计模式之组合模式

    组合模式是一种设计模式,它允许我们使用树形结构来表示部分与整体的关系,使得我们可以将对象组织成树状层级结构,使得用户可以统一地处理单个对象和对象组合。这种模式在处理具有分层结构的数据时特别有用,例如...

    Java 23种设计模式12组合模式.pdf

    ### Java 23种设计模式之组合模式 #### 模式概述 组合模式是一种结构型设计模式,主要用于处理树形结构中的对象集合问题。通过这种模式,我们可以将多个对象组织成树形结构来表示“整体-部分”的层级关系,并允许...

    C++设计模式之组合模式(Composite)

    C++设计模式之组合模式(Composite) 组合模式(Composite)是一种结构型设计模式,用于描述分支包含关系,也就是我们说的树形关系。其对象分为枝和叶,每一枝可包含枝和叶,直到全部为叶节点。 组合模式的主要...

    设计模式_组合模式.zip

    这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。 我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的...

    pengjielee#blog.me#Javascript设计模式之组合模式1

    组合模式就是用小的对象来构建更大的对象,而这些小的对象本身也许是由更小的子对象构成的。var openDoorCommand = {var openWindow

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

    本文实例讲述了Python设计模式之组合模式原理与用法。分享给大家供大家参考,具体如下: 组合模式(Composite Pattern):将对象组合成成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象...

    JAVA设计模式之组合模式原理与用法详解

    JAVA设计模式之组合模式原理与用法详解 组合模式是JAVA设计模式的一种,主要用于处理树形结构的数据。它将不同但是相关的对象组合成树形结构,以实现“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用...

    PHP设计模式之组合模式定义与应用示例

    本文实例讲述了PHP设计模式之组合模式定义与应用。分享给大家供大家参考,具体如下: &lt;?php /** * 组合模式 * * 将对象组合成树形结构以表示部分-整体的层次结构,使得客户对单个对象和复合对象的使用具有一致...

    C++设计模式之组合模式

    在GOF的《设计模式:可复用面向对象软件的基础》一书中对组合模式是这样说的:将对象组合成树形结构以表示“部分-整体”的层次结构。组合(Composite)模式使得用户对单个对象和组合对象的使用具有一致性。 组合模式...

    c++设计模式-结构型模式-组合模式

    c++设计模式-结构型模式-组合模式;qt工程;c++简单源码; 组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系...

    设计模式之美——教你写出高质量代码

    "设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...

    设计模式之禅之+组合模式

    ### 设计模式之禅之组合模式 #### 一、引言 在面向对象的设计中,设计出既符合当前需求又能适应未来变化的软件系统是一项挑战。为了提高代码的复用性和系统的灵活性,开发者们总结出了多种设计模式。本文将探讨其中...

    java常用设计模式-组合模式

    java常用设计模式-组合模式 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。这种模式使得客户端可以统一对待单个对象和对象组合。在组合模式中...

Global site tag (gtag.js) - Google Analytics