大话设计模式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)详细工厂:包含详细 ...
随机推荐
- [CF] 37 E. Trial for Chief
如果固定了一个中心,那么只需要考虑从它开始最远染到的那些点究竟染了几次. 上下左右不同的点连1边,相同的连0边,跑单源最短路就可以啦. lyd讲的是统计到最远黑点+1的最小值,但是#58数据全是白点, ...
- ubuntu16.04中将python3设置为默认+永久去除Ubuntu16.04报错
直接执行这两个命令: sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100 sudo updat ...
- php 后端规范
后端框架地址: git@gitee.com:xielisen/xcore.git 框架使用规范,内部沟通 Controller命名规范 1, 首字母大写,其余小写 2, 对应数据库名称. 不要下划线 ...
- 我的java web之路(安装)
所有的软件下载完,陪完jdk之后,迎来了一系列的安装工作... 1.安装SQL Server 2005 首先,打开ISS功能,控制面板->程序->打开或关闭windows功能 注意红框内的 ...
- HTML元素的基本特性
1,Disabled 特性: //Disabled 设置元素不可用: $(this).attr("disabled","disabled") //移除push元 ...
- tcpcopy简单用法
这篇文章介绍下网易开源的流量重放(replay)工具TCPCopy,说是简单介绍,绝对不是谦虚,因为自己了解的确实也不多.为什么不甚了解呢,大家可以到TCPCopy的官方仓库看看,https://gi ...
- ES6(Proxy 和 Reflect)
Proxy 和 Reflect 1.Proxy 和 Reflect 的概念 Proxy 意为 ‘代理’,连接了用户和真实对象之间的一个层 Reflect 意为‘反射’ 反射的是Object 2.适 ...
- Triangular Pastures (二维01背包)
描述Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The old rectang ...
- POJ-1088滑雪,典型的动态规划题,与NYOJ-10skiing一样,但NYOJ上时限是3s,用搜索可以过,但在POJ上就超时了~~
滑雪 Time Limit: 1000MS Memory Limit: 65536k ...
- vi/vim复制粘贴命令
1. 选定文本块.使用v进入可视模式,移动光标键选定内容. 2.复制的命令是y,即yank(提起) ,常用的命令如下: y 在使用v模式选定了某一块的时候,复制选定块到缓冲区用: ...