设计模式学习笔记(九)——Composite组合模式

原创 2007年09月18日 15:59:00
设计模式学习笔记(九)——Composite组合模式

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

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

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

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

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

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

浅谈JAVA设计模式之——组合模式(Composite)

一、概述 将对象组合成树形结构以表示"部分-整体"的层次结构。"Composite使得用户对单个对象和组合对象的使用具有一致性。 二、适用性 1.你想表示对象的部分-整体层次结构。 2.你希望用户忽略...
  • l1028386804
  • l1028386804
  • 2015年05月03日 12:44
  • 1782

【设计模式】学习笔记13:组合模式(Composite)

认识组合模式 上一篇中,我们可以用迭代器来实现遍历一个集合(数组,ArrayList, Vector, HashTable等)。 假设有这样一种集合结构i:餐厅里有一份菜单,菜单里面还有子菜单,其实...
  • shuangde800
  • shuangde800
  • 2013年08月20日 00:13
  • 2562

Java设计模式透析之 —— 组合(Composite)

听说你们公司最近新推出了一款电子书阅读应用,市场反应很不错,应用里还有图书商城,用户可以在其中随意选购自己喜欢的书籍。你们公司也是对此项目高度重视,加大了投入力度,决定给此应用再增加点功能。 好吧,你...
  • sinyu890807
  • sinyu890807
  • 2013年06月27日 08:37
  • 21690

设计模式学习笔记(九)——Composite组合模式

Composite组合模式主要是应对这样的问题:一类具有“容器特征”的对象——即他们在充当对象的同时,又是其他对象的容器的情况。在编写时我们常常会造成:客户代码过多地依赖于对象容器复杂的内部实现,对象...
  • liyong1115
  • liyong1115
  • 2012年03月12日 13:34
  • 299

设计模式学习笔记——组合(Composite)模式

设计模式学习笔记——组合(Composite)模式@(设计模式)[设计模式, 组合模式, composite]设计模式学习笔记组合Composite模式 基本介绍 组合案例 类图 实现代码 Entry...
  • q547550831
  • q547550831
  • 2017年04月13日 10:14
  • 242

【设计模式学习笔记九】【结构型模式】【组合模式(Composite)】

组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构;使得用户对单个对象和组合对象的使用具有一致性。又称“整体-部分“模式。 1)能够画出这个设计模式的架构框图; 2)能够根据架构框图写出对应...
  • amd123456789
  • amd123456789
  • 2015年01月27日 11:37
  • 513

java 设计模式学习笔记八 composite组合模式

composite组合模式 将对象以树形式组织起来和chain of responsibility模式类似 好处:  可以一致使用组合结构和单个对象  不必关心组合体内是否加入新部件 ...
  • retacn_yue
  • retacn_yue
  • 2012年10月05日 21:38
  • 364

设计模式C++学习笔记之十五(Composite组合模式)

15.1.解释 概念:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合的使用具有一致性。 main(),客户 CCorpNode,抽象基类,实现基本...
  • happyrabbit456
  • happyrabbit456
  • 2013年06月25日 10:11
  • 439

设计模式C++学习笔记之十五(Composite组合模式)

15.1.解释 概念:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合的使用具有一致性。 main(),客户 CCorpNode,抽象基...
  • alex_xhl
  • alex_xhl
  • 2015年08月04日 08:14
  • 289

设计模式C++学习笔记之十五(Composite组合模式)

15.1.解释 概念:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合的使用具有一致性。 main(),客户 CCorpNode,抽象基类,实现基本...
  • kriestian
  • kriestian
  • 2012年01月16日 16:54
  • 109
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式学习笔记(九)——Composite组合模式
举报原因:
原因补充:

(最多只允许输入30个字)