大话设计模式C++实现-第19章-组合模式
一、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章-组合模式的更多相关文章
- 大话设计模式C++达到-文章16章-国家模式
一.UML画画 二.概念 状态模式(State):当一个对象的内在状态改变时同意改变其行为.这个对象看起来像是改变了其类. 三.说明 以下是来自书本和网络的对状态模式的定义和分析: (1)状态模式同意 ...
- 大话设计模式C++实现-第22章-桥接模式
一.UML图 二.概念 桥接模式(Bridge):将抽象部分与它的实现部分分离,使他们都能够独立地变化. 三.说明 为什么叫"桥接模式"? 如上所看到的的UML图中,有一个聚合线, ...
- 大话设计模式C++达到-文章12章-外观模式
一.UML画画 关键词:添加Facade层. 二.概念 外观模式:为子系统中的一组接口提供一个一致的界面.此模式定义了一个高层接口,这个接口使得这一子系统更加easy使用. 三.说明 Q:外观模式在什 ...
- 大话设计模式C++实现-文章7章-代理模式
一个.UML画画 二.概念 代理模式:为其它对象提供一种代理以控制对这个对象的訪问. 三.应用场景 (1)远程代理.也就是为一个对象在不同的地址空间提供局部代表.这样能够隐藏一个对象存在于不同地址空间 ...
- 设计模式之第22章-组合模式(Java实现)
设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎 ...
- 第9章 组合模式(Composite Pattern)
原文 第9章 组合模式(Composite Pattern) 概述: 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理 ...
- 第19章 解释器模式(Interpreter Pattern)
原文 第19章 解释器模式(Interpreter Pattern) 解释器模式 导读:解释器模式,平常用的比较的少,所以在写这个模式之前在博客园搜索了一番,看完之后那叫一个头大.篇幅很长,我鼓足了劲 ...
- 大话设计模式C++实现-第1章-简单工厂模式
一.UML图 二.包括的角色 简单工厂模式包括三个角色: (1)工厂类Factory:工厂类是用来制造产品的. 因此,在Factory中有一个用于制造产品的Create函数或者Generate函数之类 ...
- 大话设计模式C++实现-第15章-抽象工厂模式
一.UML图 二.概念 抽象方法模式(Abstract Factory):提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们详细的类. 三.包括的角色 (1)抽象工厂 (2)详细工厂:包含详细 ...
随机推荐
- xfs文件系统修复
1. 错误描述 启动CentOS7系统,发现进步了图形界面,并报如下错误: Error getting authority: Error initializing authority: Could n ...
- virsh 命令
virsh是用与管理虚拟化环境中的客户机和Hypervisor的命令行工具,与virt-manager等工具类似,也是调用libvirt API来实现虚拟化的管理. 在使用virsh命令行进行虚拟化管 ...
- 树莓派 - 蓝牙 (1) 试试Beacon
首先先了解一下bluez, 以及常用的tools. - hcitool.bluetoothctl等工具,可以进行BLE设备的扫描.连接.配对.广播等操作: - hcitool可以发送HCI comma ...
- java环境配置—配置Tomcat8环境
先安装JDK,配置好jdk环境后再配置Tomcat 8 配置环境变量: TOMCAT_HOME:D:\Program Files\apache-tomcat-8.0.28 CATALINA_HOME: ...
- Leetcode 306.累加数
累加数 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 '0'- ...
- laravel 文件删除
删除文件 <?php class demo{ public function del(){ $disk = Storage::disk('public');//获取磁盘实例 $disk-> ...
- 【ITOO 5】启用MSDTC后的各种问题,以及解决方案
导读:在上篇博客中说到,通过启动微软的msdtc来实现分布式事务处理,随后,问题就来了,现在,一一总结这个过程中的问题. 一.已禁用对分布式事务管理器(MSDTC)的网络访问. 1.1,问题描述 已禁 ...
- 准确率(Precision),召回率(Recall)以及综合评价指标(F1-Measure)
准确率和召回率是数据挖掘中预测,互联网中得搜索引擎等经常涉及的两个概念和指标. 准确率:又称“精度”,“正确率” 召回率:又称“查全率” 以检索为例,可以把搜索情况用下图表示: 相关 不相关 检索 ...
- python学习笔记--面向对象的编程和类
一.面向对象的编程 面向对象程序设计--Object Oriented Programming,简称oop,是一种程序设计思想.二.面向对象的特性类:class类,对比现实世界来说就是一个种类,一个模 ...
- [Tyvj1939] 玉蟾宫(单调栈)
传送门 题目 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写 ...