组合模式

意图:

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

适用性:

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

优点:

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

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

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. (转)Openlayers 2.X加载高德地图

    http://blog.csdn.net/gisshixisheng/article/details/44853881 概述: 前面的有篇文章介绍了Openlayers 2.X下加载天地图,本节介绍O ...

  2. Ad hoc polymorphism

    与面向对象中的接口类或抽象类中定义的函数组类似: 函数的具体执行依赖与函数医用的类型. In programming languages, ad-hoc polymorphism[1] is a ki ...

  3. 15.3 Task 语法和语义

    15.3.1 声明异步方法和返回类型 async static void GetStringAsync() { using (var client = new HttpClient()) { Task ...

  4. C语言开发框架、printf(day02)

    C语言里包含以.c作为扩展名的文件,这种 文件叫源文件.C语言程序的绝大部分内容 应该记录在源文件里. C语言里还包括以.h作为扩展名的文件,这种 文件叫头文件. C语言程序里可以直接使用数字和加减乘 ...

  5. SpringBoot 整合 Mybatis 进行CRUD测试开发

    今天来和大家分享下 Spring Boot 整合 MyBatis 的 CRUD 测试方法开发.因为 MyBaits 有两种开发形式,一种基于注解,一种基于 xml . SpringBoot配置文件也有 ...

  6. laravel Job 和事件

    在做项目的时候,一直对Job和Event有个疑惑.感觉两者是相同的东西,搞不清楚两者的区别在哪里!经过一段时间的琢磨和查找了相关的资料,对Job和Event做了一些总结,以便记忆. Job Job既可 ...

  7. ecshop中{$lang.}标签的修改

    {$lang.}之类的文字都是在语言包里边定义的,所以要修改这些文字的话,我们只需要修改语言包里的文件.首先需要看一下你使用的语言是哪种,如果是中文的话,修改  languages/zh_cn/com ...

  8. springboot启动报:Error creating bean with name 'dataSource' defined in class path resource

    需要在启动类的@EnableAutoConfiguration或@SpringBootApplication中添加exclude = {DataSourceAutoConfiguration.clas ...

  9. redis liunx系统安装

    同事总结非常好,借鉴一下 原文地址:https://www.cnblogs.com/dslx/p/9291535.html redis安装 下载redis的安装包上传到Linux服务器,安装包如下 h ...

  10. 0809MySQL-InnoDB Compact 行记录格式

    InnoDB存储引擎提供了compact(5.1后的默认格式)和redundant两个格式来存放行记录数据.redundant格式是为了兼容之前的版本而保留. mysql> show table ...