结构型模式之组合模式

在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包、生活用品中的衣月艮与衣柜以及厨房中的锅碗瓢盆等。
在软件开发中也是这样,例如,文件系统中的文件与文件夹、窗体程序中的简单控件与容器控件等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。

定义与特点

组合(Composite)模式的定义:有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。

组合模式的主要优点有:

  • 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码

  • 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”

其主要缺点是:

  • 设计较复杂,客户端需要花更多时间理清类之间的层次关系;

  • 不容易限制容器中的构件;

  • 不容易用继承的方法来增加构件的新功能;

结构与实现

模式的结构

组合模式包含以下主要角色:

  • 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。

  • 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口。

  • 树枝构件(Composite)角色:是组合中的分支节点对象,它有子节点。它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法

组合模式分为透明式的组合模式和安全式的组合模式

  • 透明方式:在该方式中,由于抽象构件声明了所有子类中的全部方法,所以客户端无须区别树叶对象和树枝对象,对客户端来说是透明的。但其缺点是:树叶构件本来没有 Add()、Remove() 及 GetChild() 方法,却要实现它们(空实现或抛异常),这样会带来一些安全性问题。其结构图如图所示:

  • 安全方式:在该方式中,将管理子构件的方法移到树枝构件中,抽象构件和树叶构件没有对子对象的管理方法,这样就避免了上一种方式的安全性问题,但由于叶子和分支有不同的接口,客户端在调用时要知道树叶对象和树枝对象的存在,所以失去了透明性。其结构图如图所示:

模式的实现

假如要访问集合 c0={leaf1,{leaf2,leaf3}} 中的元素,其对应的树状图如图所示:

下面给出透明式的组合模式的实现代码,安全式的组合模式与之类似:

class Program
{
    static void Main(string[] args)
    {
        IComponent c0=new Composite();
        IComponent c1=new Composite();
        IComponent leaf1=new Leaf("1");
        IComponent leaf2=new Leaf("2");
        IComponent leaf3=new Leaf("3");
        c0.Add(leaf1);
        c0.Add(c1);
        c1.Add(leaf2);
        c1.Add(leaf3);
        c0.Operation();
        Console.Read();
    }
}

//抽象构件
public interface IComponent
{
    void Add(IComponent c);
    void Remove(IComponent c);
    IComponent GetChild(int i);
    void Operation();
}

//树叶构件
public class Leaf : IComponent
{
    private String name;
    public Leaf(String name)
    {
        this.name=name;
    }
    public void Add(IComponent c){ }
    public void Remove(IComponent c){ }
    public IComponent GetChild(int i)
    {
        return null;
    }
    public void Operation()
    {
        Console.WriteLine("树叶"+name+":被访问!");
    }
}

//树枝构件
public class Composite : IComponent
{
    private List<IComponent> children=new List<IComponent>();
    public void Add(IComponent c)
    {
        children.Add(c);
    }
    public void Remove(IComponent c)
    {
        children.Remove(c);
    }
    public IComponent GetChild(int i)
    {
        return children[i];
    }
    public void Operation()
    {
        foreach (var obj in children)
    {
    obj.Operation();
    }
    }
}

程序运行结果如下:

树叶1:被访问!
树叶2:被访问!
树叶3:被访问!

应用场景

前面分析了组合模式的结构与特点,下面分析它适用的以下应用场景:

  • 在需要表示一个对象整体与部分的层次结构的场合。

  • 要求对用户隐藏组合对象与单个对象的不同,用户可以用统一的接口使用组合结构中的所有对象的场合。

扩展:树叶节点和树枝节点进行抽象

如果对前面介绍的组合模式中的树叶节点和树枝节点进行抽象,也就是说树叶节点和树枝节点还有子节点,这时组合模式就扩展成复杂的组合模式了,如 Java AWT/Swing 中的简单组件 JTextComponent 有子类 JTextField、JTextArea,容器组件 Container 也有子类 Window、Panel。复杂的组合模式的结构图如图所示:

(0)

相关推荐

  • 结构型设计模式 - 组合模式详解

    基本介绍 1.组合模式(Composite Pattern)又叫部分整体模式,他创建了对象组的树形结构,将对象组合成树状结构以表示「整体 - 部分」的层次关系. 2.组合模式使得用户对单个对象和组合对 ...

  • 设计模式(9) 装饰模式

    装饰模式 装饰模式的特点 动态撤销功能 装饰模式可以动态向一个现有的对象添加新的功能,同时又不改变其结构.就增加功能来说,使用继承的方式生成子类也可以达到目的,但随着扩展功能的不断增加,子类的数量会快 ...

  • C#设计模式-组合模式(Composite Pattern)

    概念 组合是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们. 组合模式(Composite Pattern)是将对象组合成树形结构以表示'部分-整体'的层次 ...

  • Matlab组合模式

    组合模式(Composite),将对象组合成树形结构以表示"部分-整体"的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.组合模式的目的是让客户端不再区分操作的是组 ...

  • 面向对象设计

    面向对象程序由对象组成,对象包括数据和对数据进行操作的过程(通常称为方法). 面向对象设计最困难的部分是将系统分解成对象集合.因为要考虑许多因素:封装.粒度.依赖关系.灵活性.性能.扩展.复用等等,并 ...

  • 绘本《Leaf trouble》推荐理由

    Leaf trouble Jonathan Emmett 著 Caroline Jayne Church 绘 Scholastic出版 故事讲的是,秋天来了树叶纷纷变色掉落,小松鼠Pip注意到了老橡树 ...

  • 技术图文:03 结构型设计模式(下)

    结构型设计模式(下) 本教程主要介绍一系列用于如何将现有类或对象组合在一起形成更加强大结构的经验总结. 知识结构: 图1 知识结构 组合模式 -- 树形结构的处理 Sunny 软件公司欲开发一个杀毒( ...

  • 13、组合模式

    组合模式 文章目录 组合模式 概述 结构 结构实现 练习 源代码 透明组合模式与安全组合模式 透明组合模式 安全组合模式 组合模式优/缺点与适用环境 优点 缺点 适用环境 概述 组合模式:组合多个对象 ...

  • 结构型模式:组合模式

    文章首发: 结构型模式:组合模式 七大结构型模式之三:组合模式. 简介 姓名 :组合模式 英文名 :Composite Pattern 价值观 :专门解决各种树形疑难杂症 个人介绍 : Compose ...

  • 结构型设计模式 - 装饰者模式详解

    基本定义 装饰者模式属于结构型模式,它可以动态的将新功能附加到对象上,同时又不改变其结构.在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(OCP). 模式结构 装饰者和被装饰者有相同 ...

  • 设计模式-结构型模式总结

    结构型模式主要处理类或对象的组合,关注于如何将现有类或对象组织在一起形成更大的结构. 适配器模式 将一个类的接口转换成客户希望的另外一个接口,使原本不能一起工作的类可以一起工作. 适配器模式属于补偿机 ...

  • 结构型模式之享元模式

    在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈.例如,围棋和五子棋中的黑白棋子,图像中的坐标点或颜色,局域网 ...

  • 结构型模式之代理模式

    在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象. 定义与特点 由于某些原因需要给某对象提供一个代理以控制对该对象的访问.这时,访问对象不 ...

  • 无废话设计模式(11)结构型模式--代理模式

    0-前言 代理模式定义:为其他对象提供一种代理以控制对这个对象的访问. 1-实现 1-1.简单UML图: 1-2.代码实现 //1.抽象父类 abstract class Actor { public ...

  • 无废话设计模式(10)结构型模式--外观模式

    0-前言 外观模式定义:为子系统中的一组接口提供一个一致的界面,此模式定了一个高层接口    这一接口使得这一子系统更加容易使用: 1-实现 1-1.简单UML图: 1-2.代码实现 //1.子系统A ...

  • 无废话设计模式(9)结构型模式--享元模式

    0-前言 享元模式定义:运用共享技术有效地支持大量细粒度的对象. 1-实现 1-1.简单UML图:  1-2.代码实现 //1.抽象父类(网站父类) abstract class Website { ...