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

UML结构图:

抽象基类:
1)Component:为组合中的对象声明接口,声明了类共有接口的缺省行为(如这里的Add,Remove,GetChild函数),声明一个接口函数可以访问Component的子组件.

接口函数:
1)Component::Operatation:定义了各个组件共有的行为接口,由各个组件的具体实现.
2)Component::Add添加一个子组件
3)Component::Remove::删除一个子组件.
4)Component::GetChild:获得子组件的指针.

解析:
Component模式是为解决组件之间的递归组合提供了解决的办法,它主要分为两个派生类,其中的Leaf是叶子结点,也就是不含有子组件的结点,而Composite是含有子组件的类.举一个例子来说明这个模式,在UI的设计中,最基本的控件是诸如Button,Edit这样的控件,相当于是这里的Leaf组件,而比较复杂的控件比如List则可也看做是由这些基本的组件组合起来的控件,相当于这里的Composite,它们之间有一些行为含义是相同的,比如在控件上作一个点击,移动操作等等的,这些都可以定义为抽象基类中的接口虚函数,由各个派生类去实现之,这些都会有的行为就是这里的Operation函数,而添加,删除等进行组件组合的操作只有非叶子结点才可能有,所以虚拟基类中只是提供接口而且默认的实现是什么都不做.

实例:
一个新闻的树形菜单,它包含很多原始菜单(如国内、国际),以及由其子菜单组成的组合节点(如国内新闻下的时事、社会等),结构图如下:

代码:
Menu.h
//Menu.h
#pragma once
#include <iostream>
#include <string>
using namespace std;class Menu
{
public:Menu();Menu(std::string);virtual ~Menu();virtual void Add(Menu*);virtual void Remove(Menu*);virtual Menu* GetChild(int);virtual void Display() = 0;std::string getName(){return m_strName;}
protected:private:std::string m_strName;
};

Menu.cpp

#include "Menu.h"Menu::Menu()
{}Menu::Menu(std::string strName) : m_strName(strName)
{}Menu::~Menu()
{}void Menu::Add(Menu* pMenu)
{}void Menu::Remove(Menu* pMenu)
{}Menu* Menu::GetChild(int index)
{return NULL;
}

SubMenu.h:

#include "Menu.h"class SubMenu : public Menu
{
public:SubMenu();SubMenu(std::string);virtual ~SubMenu();void Display();
};

SubMenu.cpp:

#include "SubMenu.h"
#include <iostream>using namespace std;SubMenu::SubMenu()
{}SubMenu::SubMenu(string strName) : Menu(strName)
{}SubMenu::~SubMenu()
{}void SubMenu::Display()
{cout << getName() << endl;
}

CompositeMenu.h:

#include "Menu.h"
#include <vector>class CompositMenu : public Menu
{
public:CompositMenu();CompositMenu(std::string);virtual ~CompositMenu();void Add(Menu*);void Remove(Menu*);Menu* GetChild(int);void Display();
private://注意:vector里面放入指针的话,内存需要自己释放,而如果是对象或者//对象引用,vector会调用其析构函数std::vector<Menu*> m_vMenu;
};

CompositeMenu.cpp:

#include "CompositeMenu.h"CompositMenu::CompositMenu()
{}CompositMenu::CompositMenu(string strName) : Menu(strName)
{}CompositMenu::~CompositMenu()
{//释放指针所指的内存std::vector<Menu*>::iterator pos = m_vMenu.begin();while(pos != m_vMenu.end()){delete (*pos);}
}void CompositMenu::Add(Menu* pMenu)
{m_vMenu.push_back(pMenu);
}void CompositMenu::Remove(Menu* pMenu)
{std::vector<Menu*>::iterator pos = m_vMenu.begin();while(pos != m_vMenu.end()){if ((*pos)->getName() == pMenu->getName()){m_vMenu.erase(pos);}}
}Menu* CompositMenu::GetChild(int index)
{return m_vMenu[index];
}void CompositMenu::Display()
{cout << "+" << getName() << endl;vector<Menu*>::iterator it = m_vMenu.begin();for (; it != m_vMenu.end(); ++it){cout << "    |-";(*it)->Display();}
}

Main.cpp:

#include "Menu.h"
#include "SubMenu.h"
#include "CompositeMenu.h"int main(int argc, char* argv[])
{Menu* pMenu = new CompositMenu("国内新闻");pMenu->Add(new SubMenu("时事新闻"));pMenu->Add(new SubMenu("社会新闻"));pMenu->Display();pMenu = new CompositMenu("国际新闻");pMenu->Add(new SubMenu("国际要闻"));pMenu->Add(new SubMenu("环球视野"));pMenu->Display();return 0;
}

运行结果:

设计模式之组合模式(Composite Pattern)相关推荐

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

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

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

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

  3. C#设计模式——组合模式(Composite Pattern)

    一.概述 在软件开发中,我们往往会遇上类似树形结构的对象体系.即某一对象既可能在树形结构中作为叶节点存在,也可能作为分支节点存在.比如在文件系统中,文件是作为叶节点存在,而文件夹就是分支节点.在设计这 ...

  4. 设计模式:组合模式(Composite Pattern)

    组合模式: 又叫部分整体模式, 它创建了对象组的树形结构,将对象组合成树状结构以表示"整体-部分"的层次关系. JDK中的HashMap就使用了组合模式 public abstra ...

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

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

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

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

  7. 24组合模式(Composite Pattern)

    动机(Motivate):     组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元 ...

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

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

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

    15.2  解决方案 15.2.1  组合模式来解决 用来解决上述问题的一个合理的解决方案就是组合模式.那么什么是组合模式呢? (1)组合模式定义 (2)应用组合模式来解决的思路 仔细分析上面不用模式 ...

  10. 组合模式(Composite Pattern)

    组合模式概述 定义:组合多个对象形成树形结构以表示具有部分-整体关系的层次结构.组合模式让客户端可以统一对待单个对象和组合对象.又被成为"部分-整体"(Part-Whole)模式, ...

最新文章

  1. java map随机取值_HashMap随机取值和迭代器取值的对比
  2. 包继承Maven的超级POM
  3. 【WebGoat习题解析】AJAX Security-Insecure Client Storage
  4. 2013页面验证框架来袭。基于独创的vvc思想。还不知道的童鞋赶快围观吧!
  5. flink基本程序架构
  6. MyEclipse使用经验归纳
  7. expect的安装与使用
  8. php一行代码实现人脸识别,一行代码搞定人脸识别
  9. 第二十五章 合作博弈论【相关策略与相关均衡】
  10. java计算机毕业设计快滴预约平台MyBatis+系统+LW文档+源码+调试部署
  11. 重启计算机网络连接巨慢,开机后宽带连接很慢怎么办 开机后宽带连接很慢的三步解决办法...
  12. 【柒穆雨】平面设计好不好学?设计小白该如何学习平面设计
  13. JavaScript 的 switch 有四样写法,你知道么?
  14. python基础(1)---python简介
  15. 查询员工的薪水涨幅情况
  16. python的价值观_朴素的DevOps价值观
  17. MT6739的Android9.0 Camera kernel 驱动
  18. Windows认证体系解读
  19. Ubuntu安装nvidia显卡驱动经验和注意事项(成功率高)
  20. java处理docx文件

热门文章

  1. pytorch1.7教程实验——DCGAN生成对抗网络
  2. 使用PyCharm连接云主机教程
  3. VGG19续读【精细】,为什么叫做VGG19?==>【每一层可以看做是很多个局部特征的提取器,可以用作局部特征提取】
  4. a标签的href传递信息
  5. [UE4] Component BluePrint 组合 代替 BluePrint 继承 实现 ECS 结构
  6. 能干什么_闲鱼流量系统能干什么?真的有用吗?
  7. HbuilderX + 配置Git 代码托管 - 教程篇
  8. 非常漂亮的后台登录页面源码
  9. 外卖菜谱小程序源码-带流量主功能-外卖领劵个人也可过审
  10. linux mount挂载大小,Linux中mount挂载问题小结