组合模式(Composition

 

组合模式(Composition)

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

应用:组合图形、文件目录、GUI容器等。

模式结构

心得

用户(Client)通过抽象类(Component)提供的公用接口统一操作基本对象(Leaf)和组合对象(Composite)。抽象对象应该拥有操作基本对象和组合对象的所有接口,但是基本对象应该屏蔽某些组合对象特有的操作,如添加删除等。组合对象聚合了多个抽象对象,这种一对多的关系和继承关系正好描述了一种树形的组合结构。

举例

抽象对象看作抽象出来的文件,Leaf看作具体的文件,Composite看作文件夹。那么这个模式描述的是用户通过操纵一个抽象的文件对象,而不用关系这个对象是文件还是文件夹。文件对象是不允许添加子文件操作的,文件夹对象可以包含多个抽象的文件,即可以是文件也可以子文件夹。按照上述设计结构,C++实现如下:

class Component
{
public:
    virtual void operation()=0;
    virtual void add(Component*)=0;
    virtual void remove(Component*)=0;
    virtual Component* getChild(int i)=0;
    virtual ~Component(){}
};
class Composite:public Component
{
    list<Component*> children;
public:
    virtual void operation()
    {
        cout<<"组合对象(";
        for(list<Component*>::iterator it=children.begin();it!=children.end();++it)
        {
            (*it)->operation();
            cout<<" ";
        }
        cout<<")";
    }
    virtual void add(Component*pc)
    {
        children.push_back(pc);
    }
    virtual void remove(Component*pc)
    {
        children.remove(pc);
    }
    virtual Component* getChild(int i)
    {
        list<Component*>::iterator it;
        for(it=children.begin();it!=children.end()&&(i>0);++it,--i);
        return *it;
    }
    virtual ~Composite()
    {
        for(list<Component*>::iterator it=children.begin();it!=children.end();++it)
        {
            delete *it;
        }
    }
};
class Leaf:public Component
{
public:
    virtual void operation()
    {
        cout<<"基本对象";
    }
    virtual void add(Component*pc){}
    virtual void remove(Component*pc){}
    virtual Component* getChild(int i){return NULL;}
};

如果要初始化下边结构的文件目录结构并调用操作operation,用户可以这么操作:

Component*pc1=new Composite();
pc1->add(new Leaf());
Component*pc2=new Composite();
pc2->add(new Leaf());
pc1->add(pc2);
pc1->operation();
delete pc1;

代码中需要注意的地方是,抽象基类必须重定义虚析构函数,否则通过基类Component指针无法删除派生类Composite对象。

使用组合模式的好处从代码中可以看出来,我们可以对顶层组合对象直接进行调用operation操作,而不需要关心它的内部结构,就像操作Leaf对象一样,增大的代码的灵活性。

转载于:https://www.cnblogs.com/94julia/archive/2013/05/22/3092253.html

组合模式(Composition)相关推荐

  1. Java设计模式之组合模式详解

    文章目录 详解Java设计模式之组合模式 案例引入 组合模式 定义 模式类图结构 相关角色 典型代码 案例分析 类图设计 实例代码 结果分析 JavaJDK中的组合模式 透明组合模式 安全组合模式 组 ...

  2. 设计模式笔记(9)---组合模式(结构型)

    Gof定义 将对象组合成树形结构以表示"部分--整体"的层次结构.Composite使得用户对单个对象和组合对象使用具有一致性. 在面向对象系统中,我们经常会遇到一类具有" ...

  3. 设计模式之组合模式(Composite)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  4. 设计模式----组合模式UML和实现代码

    2019独角兽企业重金招聘Python工程师标准>>> 一.什么是组合模式? 组合模式(Composite)定义:将对象组合成树形结构以表示'部分---整体'的层次结构.组合模式使得 ...

  5. Java 组合模式及其应用

    组合模式,就是在一个对象中包含其他对象,这些被包含的对象可能是终点对象(不再包含别的对象),也有可能是非终点对象(其内部还包含其他对象,或叫组对象),我们将对象称为节点,即一个根节点包含许多子节点,这 ...

  6. 20Composite(组合)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.数据结构模式 常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用.这时候将这些特定数据结构封 ...

  7. PHP设计模式之组合模式(Composite Pattern)

    组合模式是一系列对象组合成树形结构来表示整体和部分之间的关系,组合模式的主要目的是达到,访问组合对象和访问单个对象具有一致性. 这里的组合对象比较特殊,本身可以是由其他的对象组合而成,同事,这个组合对 ...

  8. 【Unity3D】资源对象、预设、查找对象、组合模式等知识点

    1.解释对象与资源区别于联系,根据官方案例,分别总结资源和对象组织的规则/规律.     下载并查看了Adam和Survival Shooter tutorial两个官方资源案例,这些案例作为资源,可 ...

  9. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

最新文章

  1. JPA中实现查询list
  2. 整数划分递归相关问题
  3. USB外接摄像头不能用怎么办
  4. 澳大利亚短租市场火爆 “祖母房”成为热搜
  5. python携程使用_简单了解python gevent 协程使用及作用
  6. 怎样退出python的交互环境_python交互界面的退出方法
  7. Java selenium 读取网页
  8. jquery的DOM节点操作(替换元素节点)
  9. Go语言 for循环案例
  10. 分布式一致性—Paxos算法
  11. 桥接模式 和 中继模式
  12. 图像融合算法及多视角(多源)信息融合总结
  13. 《文思泉涌---如何克服学术写作拖延症》读书笔记
  14. 特别有趣的spyder运行程序
  15. java prase xml error
  16. 鸿合一体机触屏没反应怎么办_一体机电脑触摸屏没反应怎么办 触摸屏一体机故障解决方法...
  17. 旅游订票订酒店团购(APP,JAVA后台管理,MYSQL)
  18. C语言入门(八)一维数组
  19. wustoj 1506 药丸 卡特兰数
  20. SCS【7】单细胞转录组之轨迹分析 (Monocle 3) 聚类、分类和计数细胞

热门文章

  1. sqlite随机读取N条记录
  2. csdn的自动化评论
  3. 关于GC.Collect在不同机器上表现不一致问题
  4. Flutter 填坑之 表单数据哪里去了?
  5. layUI框架中文件上传前后端交互及遇到的相关问题
  6. Chrome浏览器相关细节整理
  7. Flask的多app应用,多线程如何体现
  8. centos国内yum源
  9. linux中的用户、群组和权限
  10. N900超频和刷9G-home一气呵成