组合模式

意图:

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

适用性:

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

优点:

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

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

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. Challenge–response authentication 挑战(询问)应答机制

    In computer security, challenge–response authentication is a family of protocols in which one party ...

  2. iOS 加密算法汇总

    CCCryptorStatus CCCryptorCreate( CCOperation op,             /* kCCEncrypt, etc. */ CCAlgorithm alg, ...

  3. js 响应事件

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  4. sql server time(7) 默认值

    语句为 ALTER TABLE dbo.YourTable ADD CONSTRAINT DF_TimeDefault DEFAULT '00:00:00' FOR YourTimeColumn 比如 ...

  5. javaee IO流作业02

    package Zy; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.Fil ...

  6. hadoop fs 常用命令(1)

    Hadoop: https://blog.csdn.net/mulangren1988/article/details/54860924 Hadoop:1. Hadoop fs –fs [local ...

  7. Python笔记1----数据类型

    Python数据类型: 整型.字符串.浮点型.布尔型             列表.元祖.字典 1.整型: 范围: 32位机子:-231~231-1. 64位机子:-263~263-1 2.浮点型: ...

  8. 获取url

    首先要知道Location这个对象以及这个对象中的一些属性: href:设置或返回完整的url.如本博客首页返回http://www.cnblogs.com/wymninja/ host:设置或返回主 ...

  9. SDWC2017游记

    果然我还是那么弱啊.——$Mingqi_H.$ Day -1 下午五点半回家.然而并没有什么事情可做.依旧是下载$Magical\,Mirai$,找一个黄油存起来. emmm...本来是打算去开发区那 ...

  10. 然而,该来的还是来了(Diary)

    2017-05-07     LG月赛成功炸掉...发现自己真的好多东西不会啊.对某些知识仅仅有最基础的一点理解啊!连线段树都理解不了怎么办?归并排序(including分治+贪心)全部炸掉啊.感觉自 ...