组合模式的使用场景

(1)通常,组合模式会组合出树型结构来,这意味着所有可以使用对象树来描述或操作的功能,都可以考虑使用组合模式,如UI界面设计中的容器对象、读取XML或对语句进行语法分析、OA系统中组织结构的处理、操作系统的资源管理器等。

(2)如果想表示对象的部分——整体层次结构,把整体和部分的操作统一起来,使得层次结构实现更简单,从外部来使用这个层次结构也容易。

(3)如果希望统一地使用组合结构中的所有对象,可以选用组合模式。

//声明文件

//**************************************************************************
//结构型模式:组合模式(安全型)
//场景:绘图(基本图形和复合图形)#include <iostream>
#include <string>
#include <list>using namespace std;//************************抽象组件类******************
class CGUI{
protected:string strName;/*名称*/
public:CGUI(string name);virtual ~CGUI();virtual void Draw() = 0;//绘图
};
//***********************具体组件角色*******************
//线
class CGUILine : public CGUI{
public:CGUILine(string name);~CGUILine();void Draw();
};//圆
class CGUICircle : public CGUI{
public:CGUICircle(string name);~CGUICircle();void Draw();
};//矩形
class CGUIRectangle : public CGUI{
public:CGUIRectangle(string name);~CGUIRectangle();void Draw();
};//*****************************组合组件对象**********************
class CPicture : public CGUI{
private:list<CGUI*> lstGUI;
public:CPicture(string name);~CPicture();list<CGUI*>* GetChildren();bool AddChild(CGUI* gui);bool SubChild(CGUI* gui);void Draw();
};

//实现文件

//************************抽象组件类******************
CGUI::CGUI(string name) : strName(name){}
CGUI::~CGUI(){}
//***********************具体组件角色*******************
//线
CGUILine::CGUILine(string name) : CGUI(name){}
CGUILine::~CGUILine(){cout << strName << endl;}
void CGUILine::Draw(){cout << "Draw a " << strName << endl;}//圆
CGUICircle::CGUICircle(string name) : CGUI(name){}
CGUICircle::~CGUICircle(){cout << strName << endl;}
void CGUICircle::Draw(){cout << "Draw a " << strName << endl;}//矩形
CGUIRectangle::CGUIRectangle(string name) : CGUI(name){}
CGUIRectangle::~CGUIRectangle(){cout << strName << endl;}
void CGUIRectangle::Draw(){cout << "Draw a " << strName << endl;}//*****************************组合组件对象**********************
CPicture::CPicture(string name) : CGUI(name){}
CPicture::~CPicture(){cout << strName << endl;for(list<CGUI*>::iterator it = lstGUI.begin(); it != lstGUI.end();){CGUI* pGui = (*it);delete pGui; it = lstGUI.erase(it);}
}
list<CGUI*>* CPicture::GetChildren(){return &lstGUI;}
bool CPicture::AddChild(CGUI* gui){lstGUI.push_back(gui); return true;}
bool CPicture::SubChild(CGUI* gui){lstGUI.remove(gui); return true;}
void CPicture::Draw()
{cout << "Draw Composite Object : " << strName << ">>>>>>>>>>>>>>" << endl;for(list<CGUI*>::iterator it = lstGUI.begin(); it != lstGUI.end(); it++){(*it)->Draw();}cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl;
}

//测试客户端

void main()
{CPicture oPicture("ShanShuiTu");CPicture* pShan = new CPicture("Shan");pShan->AddChild(new CGUIRectangle("Gao"));CPicture* pShui = new CPicture("Shui");pShui->AddChild(new CGUICircle("Yuan"));oPicture.AddChild(pShan);oPicture.AddChild(pShui);oPicture.Draw();
}

组合模式的应用之绘制基本图形和复合图形对象相关推荐

  1. 设计模式GOF23之-------------------结构型模式(适配器模式、代理模式、桥接模式、装饰模式、组合模式、外观模式、享元模式)

    一 结构型模式 二 适配器模式 下面我将用代码模拟键盘usb接口和ps/2的转接器 的适配器过程: 首先定义客户需求: package GOF23;public interface Target {v ...

  2. 23种设计模式——组合模式

    引言: 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和 ...

  3. 1、【设计模式】组合模式

    java设计模式之组合模式 [学习难度:★★★☆☆,使用频率:★★★★☆]  树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式 ...

  4. 设计模式学习笔记(十一)-组合模式

    树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得 ...

  5. 组合模式 -- 树形结构处理

    树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得 ...

  6. java设计模式之组合模式(树形层级)

    java设计模式之组合模式 学习难度:★★★☆☆,使用频率:★★★★☆]  树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来 ...

  7. 《HeadFirst设计模式》第九章-2组合模式

    1.声明 设计模式中的设计思想.图片和部分代码参考自<Head First设计模式>,作者Eric Freeman & Elisabeth Freeman & Kathy ...

  8. 《研磨设计模式》chap15 组合模式(1)简介

    1. 应用场景介绍 树:叶子 public class Leaf {//叶子对象的名字 private String name = ""; public Leaf(String n ...

  9. 深入浅出设计模式——组合模式(Composite Pattern)

    模式动机 对于树形结构,当容器对象(如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象(可以是容器对象,也可以是叶子对象,如子文件夹和文件)并调用执行.(递归调用) 由于 ...

最新文章

  1. 寒武纪开盘暴涨350%,市值突破1000亿,85后创始人身家超300亿!千亿盛宴背后隐忧不可忽视!...
  2. 2021.04.07 oppo HR面
  3. flutter开发之必须掌握的dart知识点:list,set,map
  4. 网络组Network Teaming
  5. 代码质量的几点新思考
  6. px、dp和sp,这些单位有什么区别?
  7. 关于ASCII字符的那些事儿
  8. LeetCode-1.两数之和(哈希表)
  9. 大数据存在的安全隐患该如何防患
  10. Java带有效期的Map
  11. Arduino智能小车——小车测速
  12. java liveness_并发 - 活跃度(Liveness) - 《Java 编程要点(Essential Java)》 - 书栈网 · BookStack...
  13. 工信部华为鸿蒙,九零科技日报 华为鸿蒙系统疑似被曝光 工信部向三大运营商颁发5G牌照​...
  14. 【实战】如何在手机上实时接收微信小店订单提醒
  15. 核酸多样性(pi)计算公式
  16. 摄影测量学空间后方交会
  17. 2021年中国游戏行业发展现状及行业发展趋势分析[图]
  18. python画简单花的代码_Python竟能画这么漂亮的花,帅呆了(代码分享)
  19. ECS 7天实践训练营day5-安装Linux服务器面板管理工具
  20. Committer 蔡正昕专访:勇敢迈出第一步,做开源没有那么难

热门文章

  1. DOTA2怎么清除缓存_5分钟带你走进mybatis缓存
  2. vue 动态获取的图片路径不显示_Vue中img的src是动态渲染时不显示的解决
  3. uni-app打包发布Android版本
  4. 盘点丨无人机与AI 深度融合及跨域应用
  5. opencv实现两个视频拼接显示
  6. 统计基础(四)假设检验
  7. java 刷浏览量代码_Java刷视频浏览量点赞量的实现代码
  8. Scrapy框架学习 - 爬取Boss直聘网Python职位信息
  9. Linux操作系统基础知识(适用于Centos/Ubuntu)
  10. 【Unity项目实战】主程进阶之路文章整理 自用记录