一. 举例

这个样例是书上的,如果有一个公司的组结结构例如以下:

它的结构非常像一棵树,当中人力资源部和財务部是没有子结点的,详细公司才有子结点。

并且最关健的是,它的每一层结构非常相似。

代码实现例如以下:

#include <iostream>

#include <list>

#include <string>

using namespace std;





//公司类,提供接口  

class Company      

{    

public:    

Company(string name)  

{  

m_name = name;  

}    





virtual ~Company()  

{}    





virtual void Add(Company *pCom)  

{}    





virtual void Display(int depth)  

{}  





protected:  

string m_name;    

};  





//详细公司  

class ConcreteCompany : public Company      

{    

public:    

ConcreteCompany(string name): Company(name)  

{}  





virtual ~ConcreteCompany()  

{}  





//添加�子树或叶子  

void Add(Company *pCom)  

{  

m_listCompany.push_back(pCom);  

}  





//显示  

void Display(int depth)  

{  

for(int i = 0;i < depth; i++)  

{  

cout<<"-";    





}  





cout<< m_name << endl;  





list<Company *>::iterator iter = m_listCompany.begin();    





for(; iter != m_listCompany.end(); iter++) //显示下层结点    

{      

(*iter)->Display(depth + 2);  

}  

}  





private:    

list<Company *> m_listCompany;    

};    





//详细的部门,財务部    

class FinanceDepartment : public Company     

{  

public:    

FinanceDepartment(string name):Company(name)  

{}    





virtual ~FinanceDepartment()  

{}    





//仅仅需显示,无限加入�函数,由于已是叶结点    

virtual void Display(int depth)  

{    

for(int i = 0; i < depth; i++)    

cout<<"-";    





cout<< m_name << endl;  

}  

};    





//详细的部门,人力资源部    

class HRDepartment :public Company      

{    

public:    

HRDepartment(string name):Company(name)  

{}  





virtual ~HRDepartment()  

{}  





//仅仅需显示,无限加入�函数,由于已是叶结点    

virtual void Display(int depth)  

{  

for(int i = 0; i < depth; i++)    

{  

cout<<"-";  

}  

cout<< m_name << endl;    

}    

};  





//////////////////////////////////////////////////////////////////////////  

//測试代码  

int main()  

{  

Company *root = new ConcreteCompany("总公司");    

Company *leaf1=new FinanceDepartment("財务部");    

Company *leaf2=new HRDepartment("人力资源部");    

root->Add(leaf1);    

root->Add(leaf2);    





//华东分公司  

Company *mid1 = new ConcreteCompany("华东分公司");    

Company *leaf3=new FinanceDepartment("华东分公司財务部");    

Company *leaf4=new HRDepartment("华东分公司人力资源部");    

mid1->Add(leaf3);  

mid1->Add(leaf4);  

root->Add(mid1);  





//南京办事处  

Company *mid2=new ConcreteCompany("南京办事处");    

FinanceDepartment *leaf5=new FinanceDepartment("南京办事处財务部");    

HRDepartment *leaf6=new HRDepartment("南京办事处人力资源部");    

mid2->Add(leaf5);  

mid2->Add(leaf6);  

root->Add(mid2);  





//杭州办事处  

Company *mid3=new ConcreteCompany("杭州办事处");    

FinanceDepartment *leaf7=new FinanceDepartment("杭州办事处財务部");    

HRDepartment *leaf8=new HRDepartment("杭州办事处人力资源部");    

mid3->Add(leaf7);    

mid3->Add(leaf8);    

mid2->Add(mid3);  





root->Display(0);  





delete leaf1;  

delete leaf2;    

delete leaf3;  

delete leaf4;    

delete leaf5;  

delete leaf6;  

delete leaf7;  

delete leaf8;    

delete mid1;  

delete mid2;    

delete root;    

getchar();

return 0;  

}  

二. 说明

1. 上面公司的结构图事实上就是总体与部分的关系,并且的话总体与部分能够一致对待,由于有非常多相似之处嘛。

2. 这棵树有两种几能,要么是棵叶,要么是子棵。

事实上这样的模式就是组合模式。

三. 组合模式

定义:将对象组合成树形结构以表示“部分-总体”的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性

要注意两点:

1. “树形”,必须是一种层次结构,有能够向下延伸的分枝,也有不变的树叶。

2. "一致性",也就是要具有非常多相似性。

结构图例如以下:

component:主要是定义统一的接口,说白了也就是提取出相似性。

composite:定义分枝节点,也就是子树。

leaf:定义叶节点,叶节点是没有子节点的。

C++设计模式实现--组合(Composite)模式的更多相关文章

  1. Head First 设计模式 —— 11. 组合 (Composite) 模式

    思考题 我们不仅仅要支持多个菜单,升值还要支持菜单中的菜单.你如何处理这个新的设计需求? P355 [提示]在我们的新设计中,真正需要以下三点: P354 我们需要某种属性结构,可以容纳菜单.子菜单和 ...

  2. Java 实现组合(Composite)模式

    类图 /** * 树 总体 * * @author stone * */ public class Tree { private TreeNode root; //根节点 public Tree(St ...

  3. 设计模式C++描述----11.组合(Composite)模式

    一. 举例 这个例子是书上的,假设有一个公司的组结结构如下: 它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点. 而且最关健的是,它的每一层结构很相似. 代码实现如下: / ...

  4. 组合(composite)模式

    定义 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性 组合模式(Composite)将小对象组合成树形结构,使用户操作组合对象如同操作一个单个对象.组 ...

  5. 八、结构模式之组合(Composite)模式

    组合模式属于对象的结构模式,有时又叫做部分-整体模式,组合模式将对象组织到树结构中,可以用来描述整体与部分的联系.其可以使客户端将单纯元素和组合元素同等对待. 当需求中是体现部分与整体层次的结构时,以 ...

  6. Java设计模式之 — 组合(Composite)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153753 听说你们公司最近新推出了一款电子书阅读应用,市场反应很不错,应用里还有 ...

  7. C#设计模式(10)——组合模式(Composite Pattern)

    一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...

  8. [设计模式] 8 组合模式 Composite

    DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字“树形”.这种树形结构在现实生活中随处可见,比如一个集团公司,它有一 ...

  9. 乐在其中设计模式(C#) - 组合模式(Composite Pattern)

    原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...

随机推荐

  1. socket select模型

    由于socket recv()方法是堵塞式的,当多个客户端连接服务器时,其中一个socket的recv调用时,会产生堵塞,使其他连接不能继续. 如果想改变这种一直等下去的焦急状态,可以多线程来实现(不 ...

  2. nginx gzip on

    # Gzip settings. gzip on; gzip_http_version 1.0;默认值是1.1 gzip_comp_level ; #压缩级别,1压缩比最小处理速度最快,9压缩比最大但 ...

  3. SQL2-子查询、join查询

    SQL常用高级查询包括:Join查询.子查询. 子查询: USE flowershopdb --子查询:在一个select语句使用另一个select 语句作为条件或数据来源. --查询块:一个sele ...

  4. 四轴飞行器1.1 Matlab 姿态显示

    四轴飞行器1.1 Matlab 姿态显示 开始做四轴了,一步一步来,东西实在很多,比较杂.先做matlab上位机,主要用来做数据分析,等板子到了可以写飞控的程序了,从底层一层一层开始写..希望能好好的 ...

  5. 百度ueditor富文本编辑器的使用

    百度ueditor富文本编辑器的使用 //以下为我在官网下载的ueditor v1.3.5 php版的大楷配置步骤第一步: //配置文件的引入应该比功能文件先引入,最后设置语言类型.即:editor. ...

  6. Vue.jsbrowserify项目模板

    Vue.js——60分钟browserify项目模板快速入门   概述 在之前的一系列vue.js文章,我们都是用传统模式引用vue.js以及其他的js文件的,这在开发时会产生一些问题. 首先,这限定 ...

  7. QR Code簡介、介紹

    QR Code為目前最常被使用的一種二維條碼,1994年由日本Denso-Wav e公司發明,QR是英文Qu ickResponse的縮寫,即快速反應的意思,1999年時,公布了符合日本當地的標準-「 ...

  8. opencv-python 学习笔记1:简单的图片处理

    一.主要函数 1. cv2.imread():读入图片,共两个参数,第一个参数为要读入的图片文件名,第二个参数为如何读取图片,包括cv2.IMREAD_COLOR:读入一副彩色图片:cv2.IMREA ...

  9. 我的MYSQL学习心得 备份和恢复(详细)

    备份 逻辑备份方法 使用MYSQLDUMP命令备份 MYSQLDUMP是MYSQL提供的一个非常有用的数据库备份工具.mysqldump命令执行时将数据库备份成一个文本文件, 该文件中实际上包含了多个 ...

  10. 使用ssh无密码登录

    使用ssh无密码登录 ssh 是一个专为远程登录会话和其他网络服务提供安全性的协议.默认状态下ssh链接是需要密码认证的,可以通过添加系统认证(即公钥-私钥)的修改,修改后系统间切换可以避免密码输入和 ...