一. 举例

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

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

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

代码实现例如以下:

#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. java面向对象之 类和对象

    OOP:Object Oriented Programming(面向对象编程) 面向对象: 1:将复杂的事情简单化. 2:面向对象将以前的过程中的执行者,变成了指挥者. 3:面向对象这种思想是符合现在 ...

  2. latex如何把目录页的页码去掉?

    页眉的显示与关闭,清空,还有样式之间的切换,需要用到如下几个命令: \pagestyle  用于设置当前页以及后续页面的页眉显示情况(可称为页版式).中间页版式可由\thispagestyle命令来指 ...

  3. 每天一个小算法(5)----找到链表倒数第K个结点

    估计这个问题在面试中被问烂了. 思路是先找到正数的第K个结点的指针pT,然后和指向头结点的指针pN一起向后移动,直到第K个指针指向NULL,此时pN指向的结点即倒数第K个结点. 如图: #includ ...

  4. 在FL2440上使用kei MDK 调试程序(J-link)

    <一>新建一个工程 单击Project ->New µVision Project...菜单项 <二>选择CPU 这里我们选择三星的2440A 点击OK后会提示你是否添加 ...

  5. 树的判断(poj nyoj hduoj)

    题目: http://ac.jobdu.com/problem.php?pid=1481 http://acm.nyist.net/JudgeOnline/problem.php?pid=129 ht ...

  6. asp.net 多站点共享StateServer Session

    <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" ...

  7. 【Delphi内联汇编学习1】Delphi与汇编

    我一直认为Delphi功能与C++相比毫不逊色,提供了丰富的控件和类.全部API以及嵌入的汇编.最近小弟在把C版的Huffman压缩改用Delphi写时,顺便“研究”了一下Delphi的位操作和嵌入式 ...

  8. Java的static详解

    static ['stætɪk] n. 静电:静电干扰 adj. 静态的:静电的:静力的 在计算机上我们译为:静态的.在Java种根据它修饰对象不同,我们可以划分为 1. static对象 2. st ...

  9. Quick Tip: Outline Elements on Hover

    How to get the xpath by clicking an html element How to get the xpath by clicking an html element Qu ...

  10. Android eng版系统烧录

    这里我只能记录下过程 Android有四层,最底层的Linux是一个kernel,然后是运行时库层,驱动大部分在这两层完成,接着是Framework层,主要是Android源码,最后是在源码基础上进行 ...