组合模式

意图:

将对象组合成树形结构以表示‘部分-整体’的层次结构,所以有时候又叫做部分-整体模式。组合模式使得用户对单个对象和组合对象的使用具有一致性。,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

适用性:

当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时。

优点:

组合模式使得基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断的递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象了。

组合模式让客户可以一致的使用组合结构和单个对象。

UML:

抽象构件(Component)角色:这是一个抽象角色,它给参加组合的对象定义出公共的接口及其默认行为,可以用来管理所有的子对象。在安全式的合成模式里,构件角色并不是定义出管理子对象的方法,这一定义由树枝构件对象给出。

树叶构件(Leaf)角色:树叶对象是没有下级子对象的对象,定义出参加组合的原始对象的行为。

树枝构件(Composite)角色:代表参加组合的有下级子对象的对象。树枝对象给出所有的管理子对象的方法,如add()、remove()、getChild()等。

代码实现:输出对应公司结构和其部门职责,这里总公司、分公司、各种部门都有共同的接口

composite.h实现:

 #ifndef COMPOSITE_H
#define COMPOSITE_H #include <list>
using std::list; #include <string>
using std::string; #include <iostream>
using namespace std; class Company
{
public:
Company(char* name):mName(name){}
virtual void attach(Company* cpn){}
virtual void detach(Company* cpn){}
virtual void display(string str){} virtual void LineOfDuty(string company){} protected:
char* mName;
list<Company* > mList;
}; class ConcreteCompany:public Company{
public:
ConcreteCompany(char* name):Company(name){}
virtual void attach(Company* cpn);
virtual void detach(Company* cpn);
virtual void display(string str);
virtual void LineOfDuty(string company);
}; class HrDepartment:public Company{
public:
HrDepartment(char* name):Company(name){}
virtual void display(string str); virtual void LineOfDuty(string company);
}; class FinanceDepartment:public Company{
public:
FinanceDepartment(char* name):Company(name){}
virtual void display(string str); virtual void LineOfDuty(string company);
}; #endif

composite.cpp:

 #include "composite.h"
#include <iostream>
using namespace std; void ConcreteCompany::attach(Company* cpn)
{
if(nullptr != cpn)
{
mList.push_back(cpn);
}
} void ConcreteCompany::detach(Company* cpn)
{
if(nullptr != cpn)
{
mList.remove(cpn);
}
} void ConcreteCompany::display(string str)
{
list<Company* >::iterator beg = mList.begin();
cout<<str<<mName<<endl;
str = str + str;
for ( ; beg != mList.end(); beg++)
{
(*beg)->display(str);
}
} void ConcreteCompany::LineOfDuty(string company)
{
list<Company* >::iterator beg = mList.begin();
string name = mName;
for ( ; beg != mList.end(); beg++)
{
(*beg)->LineOfDuty(name);
}
} void HrDepartment::display(string str)
{
cout<<str<<mName<<endl;
} void HrDepartment::LineOfDuty(string company)
{
cout<<company<<"员工招聘培训管理!"<<endl;
} void FinanceDepartment::display(string str)
{
cout<<str<<mName<<endl;
} void FinanceDepartment::LineOfDuty(string company)
{
cout<<company<<"公司财务收支管理!"<<endl;
}

main.cpp:

 #include <iostream>
#include "composite.h"
using namespace std; void main()
{
//
ConcreteCompany com1("木鸟飞公司");
FinanceDepartment com2("总公司财务部");
HrDepartment com3("总公司人力部"); com1.attach(&com2);
com1.attach(&com3); ConcreteCompany com11("木鸟飞东北分公司");
FinanceDepartment com22("东北分公司财务部");
HrDepartment com33("东北分公司人力部"); com11.attach(&com22);
com11.attach(&com33); com1.attach(&com11); string str("─");
com1.display(str); cout<<endl; com1.LineOfDuty(str);
return;
}

组合模式(composite)C++实现的更多相关文章

  1. 组合模式/composite模式/对象结构型模式

    组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...

  2. 浅谈设计模式--组合模式(Composite Pattern)

    组合模式(Composite Pattern) 组合模式,有时候又叫部分-整体结构(part-whole hierarchy),使得用户对单个对象和对一组对象的使用具有一致性.简单来说,就是可以像使用 ...

  3. 二十四种设计模式:组合模式(Composite Pattern)

    组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...

  4. 设计模式(七)组合模式Composite(结构型)

    设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 ...

  5. 乐在其中设计模式(C#) - 组合模式(Composite Pattern)

    原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...

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

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

  7. 设计模式 - 组合模式(composite pattern) 迭代器(iterator) 具体解释

    组合模式(composite pattern) 迭代器(iterator) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考组合模式(composit ...

  8. 设计模式系列之组合模式(Composite Pattern)——树形结构的处理

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  9. 设计模式--组合模式Composite(结构型)

    一.概念 组合模式允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 二.UML图 1.Component(对象接口),定义 ...

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

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

随机推荐

  1. Coreldraw软件反盗版提示x8有优惠活动 cdr x8提示盗版怎么办?

    CorelDRAW X8装不上,我的悲伤有这么大,或者比这还大一点...♥♥♥如果你遇到这样的断了网,卸了装,装了卸,然后再安装的...╮(-_-)╭这样的保存和另存为都点不了,不敢关电脑的亦或是这样 ...

  2. ORACLE 查询不走索引的原因分析,解决办法通过强制索引或动态执行SQL语句提高查询速度

    (一)索引失效的原因分析: <>或者单独的>,<,(有时会用到,有时不会) 有时间范围查询:oracle 时间条件值范围越大就不走索引 like "%_" ...

  3. HTML 1.1页面js修改文字颜色

    昨天的报告页面,想要实现根据不同文字内容改变字体颜色,效果图: 调试了半天出不来效果,最后请教了前端,上代码: <!DOCTYPE html> <html lang="en ...

  4. 洛谷P1478 陶陶摘苹果(升级版)【水题】

    又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他手够不着时,他会站到椅子上再试试. 这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力气只剩下s ...

  5. Java Web学习总结(22)——使用kaptcha生成验证码

    kaptcha是一个简单好用的验证码生成工具,通过配置,可以自己定义验证码大小.颜色.显示的字符等等.下面就来讲一下如何使用kaptcha生成验证码以及在服务器端取出验证码进行校验. 一.搭建测试环境 ...

  6. 纪录:Solr6.4.2+Flume1.7.0 +morphline+kafka集成

    当前大多数企业版hadoop的solr版本都还停留在solr4.x,由于这个版本的solr本身的bug较多,使用起来会出很多奇怪的问题.如部分更新日期字段失败的问题. 最新的solr版本不仅修复了以前 ...

  7. Tomcat日志配置远程Syslog采集

    http://blog.csdn.net/leizi191110211/article/details/51593748

  8. Codeforces Round #253 (Div. 1)-A,B

    A题: 由题意可知,最多翻10次就能够(事实上8次就够了).那么我们就用状态压缩表示状态. 对于某种状态,假设某一位为0,那么代表这一位不翻,否则代表这一位翻. 对于某一种翻的状态: 假设牌中有G3, ...

  9. python清除数据库错误日志

    # coding=gbk from encodings import gbk  import re   import sys import  os import  pyodbc import trac ...

  10. HTML的表单form以及form内部标签

    <html> <head> <title> form表单的使用 </title> <!-- 标签名称:form 表单标签 属性:action:提交 ...