一、UML图

关键词:Leaf是叶子,Composite是非叶子节点,Composite包括Leaf。

二、概念

组合模式(Composite):将对象组合成树形结构以表示“部分-总体”的层次结构。

组合模式使得用户对单个对象和组合对象的使用具有一致性。

三、说明

角色:

(1)Component:为组合中的对象声明接口。在适当情况下,实现全部类共同拥有接口的默认行为。声明一个接口用于訪问和管理Component 的子部件。

(2)Leaf:在组合中白哦是叶节点对象,叶节点没有子节点。

(3)Composite:定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关的操作,比方添加Add和删除Remove。

什么时候使用组合模式?

当你发现需求中是体现部分与总体层次的结构时。以及你希望用户能够忽略组合对象与单个对象的不同,统一地使用组合结构中的全部对象时,就应该考虑用组合模式了。

使用组合模式的优点?

(1)组合模式定义了包括基本对象(Leaf)和组合对象(Composite)的类层次结构。

基本对象能够被组合成更复杂的组合对象,而这个组合对象又能够被组合,这样不断地地柜下去,客户代码中。不论什么用到基本对象的地方都能够使用组合对象了。

(2)用户不用关心究竟是处理一个叶子节点还是处理一个组合组件,也就不用为定义组合而写一些推断语句了。

(3)简而言之,组合模式让客户能够一致的使用组合结构和单个对象。

四、C++实现

(1)Composite.h

#ifndef COMPOSITE_H
#define COMPOSITE_H #include <iostream>
#include <list>
#include <string> //Component:此处为抽象公司类
class Company
{
protected:
std::string name;
public:
Company(std::string name)
{
this->name=name;
} //添加节点
virtual void Add(Company* c)=0;
//删除节点
virtual void Remove(Company* c)=0;
//展示
virtual void Display(int depth)=0;
//职责
virtual void LineOfDuty()=0; //运算符重载
inline bool operator==(const Company &company) const
{
return this->name==company.name;
}
}; //Composite:详细公司类
class ConcreteCompany:public Company
{
private:
std::list<Company*> *children;
public:
ConcreteCompany(std::string name):Company(name)
{
children=new std::list<Company*>;
}
~ConcreteCompany()
{
for(std::list<Company*>::iterator it=children->begin();it!=children->end();it++)
delete *it;
delete children;
}
//添加叶子节点
void Add(Company* c)
{
children->push_back(c);
}
//删除叶子节点
void Remove(Company* c)
{
for(std::list<Company*>::iterator it=children->begin();it!=children->end();it++)
{
if(**it==*c)
{
children->erase(it);
break;
}
}
}
//打印
void Display(int depth)
{
for(int i=0;i<depth;i++)
std::cout<<"-";
std::cout<<name<<std::endl; for(std::list<Company*>::iterator it=children->begin();it!=children->end();it++)
(*it)->Display(depth+4);
}
//职责
void LineOfDuty()
{
for(std::list<Company*>::iterator it=children->begin();it!=children->end();it++)
(*it)->LineOfDuty();
}
}; //Leaf:人力资源部
class HRDepartment:public Company
{
public:
HRDepartment(std::string name):Company(name){} void Add(Company* c){}
void Remove(Company* c){}
void Display(int depth)
{
for(int i=0;i<depth;i++)
std::cout<<"-";
std::cout<<name<<std::endl;
}
void LineOfDuty()
{
std::cout<<name<<" 员工招聘培训管理"<<std::endl;
}
}; //Leaf:財务部
class FinanceDepartment:public Company
{
public:
FinanceDepartment(std::string name):Company(name){} void Add(Company* c){}
void Remove(Company* c){}
void Display(int depth)
{
for(int i=0;i<depth;i++)
std::cout<<"-";
std::cout<<name<<std::endl;
}
void LineOfDuty()
{
std::cout<<name<<" 公司財务收支管理"<<std::endl;
}
}; #endif

(2)Client.cpp

#include "Composite.h"
#include <iostream>
#include <string>
#include <cstdlib> //Client,client
void main()
{
Company* root=new ConcreteCompany("北京总公司");
root->Add(new HRDepartment("总公司人力资源部"));
root->Add(new FinanceDepartment("总公司財务处")); Company* comp=new ConcreteCompany("上海华东分公司");
comp->Add(new HRDepartment("华东分公司人力资源部"));
comp->Add(new FinanceDepartment("华东分公司財务处")); root->Add(comp); Company* comp1=new ConcreteCompany("南京办事处");
comp1->Add(new HRDepartment("南京办事处人力资源部"));
comp1->Add(new FinanceDepartment("南京办事处財务处")); comp->Add(comp1); Company* comp2=new ConcreteCompany("杭州办事处");
comp2->Add(new HRDepartment("杭州办事处人力资源部"));
comp2->Add(new FinanceDepartment("杭州办事处財务处")); comp->Add(comp2); std::cout<<"结构图:"<<std::endl<<std::endl;
root->Display(1); std::cout<<std::endl<<"职责:"<<std::endl<<std::endl;
root->LineOfDuty(); delete root;
system("pause");
}

(3)执行截图

大话设计模式C++实现-第19章-组合模式的更多相关文章

  1. 大话设计模式C++达到-文章16章-国家模式

    一.UML画画 二.概念 状态模式(State):当一个对象的内在状态改变时同意改变其行为.这个对象看起来像是改变了其类. 三.说明 以下是来自书本和网络的对状态模式的定义和分析: (1)状态模式同意 ...

  2. 大话设计模式C++实现-第22章-桥接模式

    一.UML图 二.概念 桥接模式(Bridge):将抽象部分与它的实现部分分离,使他们都能够独立地变化. 三.说明 为什么叫"桥接模式"? 如上所看到的的UML图中,有一个聚合线, ...

  3. 大话设计模式C++达到-文章12章-外观模式

    一.UML画画 关键词:添加Facade层. 二.概念 外观模式:为子系统中的一组接口提供一个一致的界面.此模式定义了一个高层接口,这个接口使得这一子系统更加easy使用. 三.说明 Q:外观模式在什 ...

  4. 大话设计模式C++实现-文章7章-代理模式

    一个.UML画画 二.概念 代理模式:为其它对象提供一种代理以控制对这个对象的訪问. 三.应用场景 (1)远程代理.也就是为一个对象在不同的地址空间提供局部代表.这样能够隐藏一个对象存在于不同地址空间 ...

  5. 设计模式之第22章-组合模式(Java实现)

    设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎 ...

  6. 第9章 组合模式(Composite Pattern)

    原文 第9章 组合模式(Composite Pattern) 概述: 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理 ...

  7. 第19章 解释器模式(Interpreter Pattern)

    原文 第19章 解释器模式(Interpreter Pattern) 解释器模式 导读:解释器模式,平常用的比较的少,所以在写这个模式之前在博客园搜索了一番,看完之后那叫一个头大.篇幅很长,我鼓足了劲 ...

  8. 大话设计模式C++实现-第1章-简单工厂模式

    一.UML图 二.包括的角色 简单工厂模式包括三个角色: (1)工厂类Factory:工厂类是用来制造产品的. 因此,在Factory中有一个用于制造产品的Create函数或者Generate函数之类 ...

  9. 大话设计模式C++实现-第15章-抽象工厂模式

    一.UML图 二.概念 抽象方法模式(Abstract Factory):提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们详细的类. 三.包括的角色 (1)抽象工厂 (2)详细工厂:包含详细 ...

随机推荐

  1. [LOJ] 分块九题 6

    单点插入,单点查询. 优化了的链表. 链表老写错,干脆用vector,也不算慢. 注意链表退化的问题,及时(比如操作根号n次)就重新建块,实测速度可以提高一倍,这还是数据随机的情况,若涉及大量同一位置 ...

  2. MySQL索引之博客荐读

    推荐博客: 寒江独钓. 浅谈算法和数据结构: 十 平衡查找树之B树 张洋. MySQL索引背后的数据结构及算法原理 漫画算法:什么是 B+ 树? B树和B+树的插入.删除图文详解 Jeremy Col ...

  3. 01-mysql中的数据类型

    mysql中的列数据类型:数值型.字符串类型.日期/时间类型3种 几种列类型描述使用了下述惯例:· M #表示最大显示宽度.最大有效显示宽度是255.· D #适用于浮点和定点类型,表示小数点后面的位 ...

  4. crontab 和 supervisor

    crontab linux系统自带的工具,可以做定时任务,最小间隔是1分钟 配置crontab 命令 如果是以root用户编辑的,那么最后运行也是以root用户运行脚本文件 crontab -e 命令 ...

  5. 爬虫app信息抓取之apk反编译抓取

    之前也抓过一些app,数据都比较好取,也没有研究的太深,毕竟还有android 模拟器+ appium 的方法.直到遇见了一款app ,具体名字就不说了,它安装在模拟器上竟然打不开 !!第一次遇见上网 ...

  6. LeetCode(82)Remove Duplicates from Sorted List

    题目 Given a sorted linked list, delete all duplicates such that each element appear only once. For ex ...

  7. Android开发——获取应用数据/缓存大小并清理缓存

    1. 获取应用数据/缓存大小 其中pm为实例化的PackageManager,因为需要遍历所有的已安装的应用.因此需要开启子线程进行处理. 还有需要注意的是,在Android4.2之前getPacka ...

  8. idea与eclipse项目相互导入的过程

    idea项目导出到桌面 很简单,直接去项目所在目录考出即可,但是考出的项目往往都特别大,这是因为考出之前  我们不要忘记把idea的输出目录删除 每次启动服务器运行idea项目的时候  都会有一个输出 ...

  9. usort 使用(转载)

    private function arrCmp($a,$b){ if($a['day_time'] == $b['day_time']){  return 0; } return($a['day_ti ...

  10. IdHttp 资料

    http://blog.csdn.net/delphizhou/article/details/3085704 IdHttp 资料 网上找了些不过很不好找.今天找了些收藏在一起.以便他人查阅, idh ...