一、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. xfs文件系统修复

    1. 错误描述 启动CentOS7系统,发现进步了图形界面,并报如下错误: Error getting authority: Error initializing authority: Could n ...

  2. virsh 命令

    virsh是用与管理虚拟化环境中的客户机和Hypervisor的命令行工具,与virt-manager等工具类似,也是调用libvirt API来实现虚拟化的管理. 在使用virsh命令行进行虚拟化管 ...

  3. 树莓派 - 蓝牙 (1) 试试Beacon

    首先先了解一下bluez, 以及常用的tools. - hcitool.bluetoothctl等工具,可以进行BLE设备的扫描.连接.配对.广播等操作: - hcitool可以发送HCI comma ...

  4. java环境配置—配置Tomcat8环境

    先安装JDK,配置好jdk环境后再配置Tomcat 8 配置环境变量: TOMCAT_HOME:D:\Program Files\apache-tomcat-8.0.28 CATALINA_HOME: ...

  5. Leetcode 306.累加数

    累加数 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 '0'- ...

  6. laravel 文件删除

    删除文件 <?php class demo{ public function del(){ $disk = Storage::disk('public');//获取磁盘实例 $disk-> ...

  7. 【ITOO 5】启用MSDTC后的各种问题,以及解决方案

    导读:在上篇博客中说到,通过启动微软的msdtc来实现分布式事务处理,随后,问题就来了,现在,一一总结这个过程中的问题. 一.已禁用对分布式事务管理器(MSDTC)的网络访问. 1.1,问题描述 已禁 ...

  8. 准确率(Precision),召回率(Recall)以及综合评价指标(F1-Measure)

    准确率和召回率是数据挖掘中预测,互联网中得搜索引擎等经常涉及的两个概念和指标. 准确率:又称“精度”,“正确率” 召回率:又称“查全率” 以检索为例,可以把搜索情况用下图表示:   相关 不相关 检索 ...

  9. python学习笔记--面向对象的编程和类

    一.面向对象的编程 面向对象程序设计--Object Oriented Programming,简称oop,是一种程序设计思想.二.面向对象的特性类:class类,对比现实世界来说就是一个种类,一个模 ...

  10. [Tyvj1939] 玉蟾宫(单调栈)

    传送门 题目 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写 ...