组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

例如 在C# WinForm 应用程序编程中 RadioButton控件是单选按钮控件 ,GroupBox 控件是控件组,是装入其他控件或其他控件组的容器。当GroupBox设置为disable时,那么其子控件和子GroupBox也要变成disable。如何实现这样的级联?把控件组视为一个(整体)对象,当(整体)对象的属性发生变化时,其中的(部分)子对象属性也跟着变化?这就需要利用到组合模式,利用树形结构进行递归,完成“整体-部分”的批量处理。其中像控件组这样的对象在下图中是Composite,像其他单控件如 RadioButton,Button等在下图中是Leaf,他们共同继承于控件的抽象类Widget

class IWidget{virtual void disable() = 0;virtual void visible() = 0;
}
/**单控件类.....*/
class RadioButton:public IWidget{private :bool isVisited_;public :RadioButton(){isVisited_ =true;}virtual void disable(){isVisited_ =false;}virtual void visible(){isVisited_ =true;}
}
class Button:public IWidget{private :bool isVisited_;public :Button(){isVisited_ =true;}virtual void disable(){isVisited_ =false;}virtual void visible(){isVisited_ =true;}
}/**IWidget集合类.....*/
class GroupBox:public IWidget{private :bool isVisited_;vector<IWidget *> widgets_;public :GroupBox(){isVisited_ =true;}virtual void disable(){isVisited_ =false;for(auto& w : widgets_){w -> disable();}}virtual void visible(){isVisited_ =true;for(auto& w : widgets_){w -> visible();}}void add(IWidget &w){ widgets_.push_back(w);}void remove(IWidget & w){ widgets_.remove(w);}
}void main(){RadioButton radioButton1;RadioButton radioButton2;Button button1;Button button2;GroupBox groupBox1;GroupBox groupBox2;GroupBox groupBoxALL;groupBox1.add(radioButton1);groupBox1.add(button1);groupBox2.add(radioButton2);groupBox2.add(button2);groupBoxALL.add(groupBox1);groupBoxALL.add(groupBox2);groupBox1.disable(); //button1 和radioButton1 和groupBox1的isVisited_状态都是falsegroupBox1.visible(); //button1 和radioButton1 和groupBox1的isVisited_状态都是truegroupBoxALL.disable();/*button1和radioButton1 和groupBox1和button2和radioButton2 和groupBox2和groupBoxALL的isVisited_状态都是false*/
}

设计模式的理解:组合模式 (Composite)相关推荐

  1. 设计模式之略见一斑(组合模式Composite)

    定义: 将对象以树形结构组织起来,以达成"部分-整体"的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. 组合模式其实对是我们数据结构中的树形结构.一颗树下面还有子树,将 ...

  2. java设计模式组合模式详解_《JAVA设计模式》之组合模式(Composite)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述合成(Composite)模式的:html 合成模式属于对象的结构模式,有时又叫作"部分--总体"模式.合成模式将对象 ...

  3. [设计模式] 8 组合模式 Composite

    DP书上给出的定义:将对象组合成树形结构以表示"部分-整体"的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字"树形".这种树形结构在现实 ...

  4. 设计模式 -- 组合模式(Composite)

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 主要内容包括: 初识组合 ...

  5. 设计模式(17):结构型-组合模式(Composite)(2)

    设计模式(Design pattern) 是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式 ...

  6. 研磨设计模式 之 组合模式(Composite) 3——跟着cc学设计系列

    15.3  模式讲解 15.3.1  认识组合模式 (1)组合模式的目的 组合模式的目的是:让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作. 实现这个目标的关键之处,是设计一 ...

  7. 【设计模式自习室】结构型:组合模式 Composite

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  8. python 设计模式之组合模式Composite Pattern

    #引入一 文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件. 那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象. 这是一个树形结构 咱们生活工作中常用的一种结构 ...

  9. Java设计模式 —— 组合模式(Composite)

    Java设计模式 -- 组合模式(Composite) 定义 Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性. ...

  10. 【设计模式】组合模式 Composite Pattern

    树形结构是软件行业很常见的一种结构,几乎随处可见,  比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...

最新文章

  1. useradd与adduser的区别
  2. spring in action 4 线路图
  3. 学习嵌入式系统需要具备的条件、方法及步骤
  4. 战争尾声(nowcoder 215073)
  5. HTML5常用标签及特殊字符表
  6. 新功能:阿里云负载均衡支持HTTP/2、WSS协议
  7. 详解linux io flush
  8. 深度学习 GPU环境 Ubuntu 16.04 + Nvidia GTX 1080 + Python 3.6 + CUDA 9.
  9. 真的假的?LiFi或将取代WiFi
  10. 随想录(windows和linux进行socket通信)
  11. Angular CLI 常用命令
  12. 学习使用TestNG进行数据驱动测试
  13. [转]CMS Content Management System(内容管理系统) 提供商
  14. 解决IIS安装的问题:要求输入用户名和密码
  15. 7-60 致命的珠宝 (10分)
  16. 企业微信机器人WorkTool使用文档
  17. Markdown语法中使用表情符号
  18. 零信任架构:下一代网络安全架构?
  19. 安路TD和modelsim仿真
  20. Python批量处理lrmx格式文档内指定内容

热门文章

  1. javascript中常用数组函数
  2. iOS培训章节——C++函数的重载
  3. 2. 两数相加(中等)
  4. SpringBatch处理适配器ItemProcessorAdapter详解
  5. SpringSecruity整合Oauth2 详解(一)
  6. Corodva Could not resolve com.android.tools.build:gradle:3.0.1 解决方法
  7. Python3需要安装的MySQL库是mysqlclient
  8. Python Django开发案例:显示登录页面
  9. Linux hostname指令
  10. Linux 网络及IP概述