今天研究了一下设计模式15 组合模式 本人是菜鸟一枚,所以一开始完全不懂组合究竟是什么意思。先上图一张,树形结构图:

文档说,如果想做出这样的结构,通常考虑组合模式。那是为什么呢?现在让我们看一下组合模式的类图一本结构

想了很久,结合源代码,才搞明白,其实这个组合,意思就是说,如果我们要做这种树状结果,比如公司想让我们吧所有部门人员的 姓名,职位,薪水遍历出来,这个时候怎么办呢?那我们看树状机构图,有叶子结点和枝干结点,2种,但是2种有共性,那就是每个结点都有姓名,职位,薪水。所有叶子结点和枝干结点共同继承结点接口。因为枝干结点本身还有子结点,而且子结点里面,即可能有叶子结点,也可能有枝干结点,二者不是同一个类型啊,怎么解决呢? 因为 二者都继承了共同的基类 所以 对于枝干结点,我们给其添加属性成员 vector<Component*> s,这样S中既可以存放叶子结点,也可以存放枝干结点,这个地方就体现了 1....n 这个意义。同时也解决了一个容器存储不同类型的问题。

我估计我说的大家也不是特别理解,下面上源代码,结合源代码,相信您会明白的。

.zuhepattern.h
#include<string>
#include<iostream>
#include<vector>
using namespace std;
class CCorpNode
{
public:
CCorpNode();
CCorpNode(string _name,string _pos,int _salary);
virtual ~CCorpNode();
virtual string GetInfo();
void setParent(CCorpNode* _pParent);
CCorpNode* GetParent();
virtual bool IsLeaf()=;
private:
string m_name;
string m_position;
int m_salary;
protected:
bool m_isLeaf;
CCorpNode *m_pParent;
};
class CBranchNode:public CCorpNode
{
public:
CBranchNode();
CBranchNode(string name,string pos,int salary);
~CBranchNode();
void add(CCorpNode *pcorpNode);
vector<CCorpNode*> GetSubordinateInfo();
bool IsLeaf();
private:
vector<CCorpNode*> m_subordinateList;
}; class CLeafNode:public CCorpNode
{
public:
CLeafNode();
CLeafNode(string name ,string pos,int salary);
~CLeafNode();
bool IsLeaf();
}; //实现部分
#include "stdafx.h"
#include "zuhepattern.h"
CCorpNode::CCorpNode()
{
this->m_name="";
this->m_position="";
this->m_salary=;
}
CCorpNode::CCorpNode(string _name,string _pos,int _salary):m_name(_name),m_position(_pos),m_salary(_salary)
{ }
CCorpNode::~CCorpNode(){}
string CCorpNode::GetInfo()
{
char ss[];
itoa(this->m_salary,ss,);
string info="";
info=info+"姓名:"+this->m_name;
info=info+"\t职位:"+this->m_position;
info=info+"\t薪水:"+ss;
return info;
}
void CCorpNode::setParent(CCorpNode* _pParent)
{
this->m_pParent=_pParent;
}
CCorpNode* CCorpNode::GetParent()
{
return this->m_pParent;
}
CBranchNode::CBranchNode(){
this->m_isLeaf=false;
}
CBranchNode::CBranchNode(string name, string pos, int salary):CCorpNode(name, pos, salary)
{
this->m_isLeaf=false;
}
CBranchNode::~CBranchNode(){} void CBranchNode::add(CCorpNode* pcorpNode)
{
this->setParent(this);
this->m_subordinateList.push_back(pcorpNode); }
vector<CCorpNode*> CBranchNode::GetSubordinateInfo()
{
return this->m_subordinateList;
}
bool CBranchNode::IsLeaf()
{
return this->m_isLeaf;
}
CLeafNode::CLeafNode()
{
this->m_isLeaf=true;
}
CLeafNode::CLeafNode(string name ,string pos,int salary):CCorpNode(name, pos, salary)
{
this->m_isLeaf=true;
}
CLeafNode::~CLeafNode(){}
bool CLeafNode::IsLeaf()
{
return this->m_isLeaf;
} //main函数部分 #include "stdafx.h"
#include <string>
#include<iostream>
#include "zuhepattern.h"
using namespace std; static CBranchNode compositeCorpTree()
{
//根节点
CBranchNode root("王大麻子","总经理",);
//三个部门经理--树叉
CBranchNode developDep("刘大瘸子","研发部经理",);
CBranchNode saleDep("马二拐子","销售部门经理",);
CBranchNode financeDep("赵三驼子","研发部经理",); CBranchNode fistDevGroup("杨三","开发一组长",);
CBranchNode secondDevGroup("李四","开发二组长",); //叶子结点
CLeafNode a("a","开发人员",);
CLeafNode b("b","开发人员",);
CLeafNode c("c","开发人员",);
CLeafNode d("d","开发人员",);
CLeafNode e("e","开发人员",);
CLeafNode f("f","开发人员",);
CLeafNode g("g","开发人员",);
CLeafNode h("h","销售人员",);
CLeafNode i("i","销售人员",);
CLeafNode j("j","财务人员",);
CLeafNode k("k","ceo秘书",);
CLeafNode zhenglaoliu("郑老六","研发部副经理",); //开始组装
//CEO下有三个部门经理和一个秘书 root.add(&k);
root.add(&developDep);
root.add(&saleDep);
root.add(&financeDep);
//研发部经理
developDep.add(&zhenglaoliu);
developDep.add(&fistDevGroup);
developDep.add(&secondDevGroup); //开发组成员 fistDevGroup.add(&a);
fistDevGroup.add(&b);
fistDevGroup.add(&c);
secondDevGroup.add(&d);
secondDevGroup.add(&e); secondDevGroup.add(&f);
secondDevGroup.add(&g);
secondDevGroup.add(&a); //销售部人员
saleDep.add(&h);
saleDep.add(&i); //最后一个财务
financeDep.add(&j);
return root;
} static string getTreeInfo(CBranchNode root)
{
vector<CCorpNode*> subordinatelist=root.GetSubordinateInfo();
string info="";
for(vector<CCorpNode*>::iterator ts=subordinatelist.begin();ts!=subordinatelist.end();++ts)
{
if((*ts)->IsLeaf())
{
info=info+(*ts)->GetInfo()+"\n";
}else
{
info=info+(*ts)->GetInfo()+"\n"+getTreeInfo(*((CBranchNode*)*ts)); //基类对象是无法转为子类对象的,所以要先由基类指针转为子类指针,再转为子类对象。
}
}
return info;
} int main(int argc, _TCHAR* argv[])
{ CBranchNode ceo=compositeCorpTree();
cout<<ceo.GetInfo()<<endl;
cout<<getTreeInfo(ceo)<<endl;
int i=;
cin>>i;
return ;
}

c++设计模式15 --组合模式的更多相关文章

  1. 再起航,我的学习笔记之JavaScript设计模式15(组合模式)

    组合模式 组合模式(Composite): 又称部分-整体模式,将对象组合成树形结构以表示"部分整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 如果有一个 ...

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

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

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

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

  4. JavaScript设计模式之----组合模式

    javascript设计模式之组合模式 介绍 组合模式是一种专门为创建Web上的动态用户界面而量身制定的模式.使用这种模式可以用一条命令在多个对象上激发复杂的或递归的行为.这可以简化粘合性代码,使其更 ...

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

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

  6. C#设计模式:组合模式(Composite Pattern)

    一,C#设计模式:组合模式(Composite Pattern) using System; using System.Collections.Generic; using System.Linq; ...

  7. 【GOF23设计模式】组合模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_组合模式.树状结构.杀毒软件架构.JUnite底层架构.常见开发场景 package com.test.composite ...

  8. iOS设计模式之组合模式

    组合模式(Composite) 基本理解 整体和部分可以一直对待. 组合模式:将对象组合成树形结构以表示"部分--整体"的层次结构.组合模式使得用户对单个对象和组合独享的使用具有一 ...

  9. 设计模式:组合模式(Composite)

    定   义:将对象组合树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象使用具有一致性. 结构图: Component类: abstract class Component ...

随机推荐

  1. JSP自定义标签——简单标签(2)

    在前一篇博客中,我们已经学习了自定义的简单标签的基本使用方法,这一篇我们来学习如何在简单标签中添加标签属性.对自定义标签添加一些属性,可以使我们的标签功能更加灵活和复用.例如前一篇博客使用简单标签来对 ...

  2. 关于storyboard的一点学习记录

    1.storyboard中“Main storyboard file base name”这个用来注册启动是所需要的storyboard 文件名称.当我们程序启动的时候,我们的工程就会根据这一项来自动 ...

  3. win32 sdk绘制ListBox控件

    1>产生: // HWND CreateLB(HWND parentWnd) { HWND hListBox=0; hListBox = CreateWindow("LISTBOX&q ...

  4. OpenVPN多处理之-netns容器与iptables CLUSTER

    假设还是沉湎于之前的战果以及强加的感叹,不要冥想,将其升华. 1.C还是脚本 以前,我用bash组织了复杂的iptables,ip rule等逻辑来配合OpenVPN,将其应用于差点儿全部能够想象得到 ...

  5. javascript(七)document.write

    <h1>test</h1> <button type="button" onclick="my_function">点击me ...

  6. 关于Delphi中的字符串的浅析(瓢虫大作,里面有内存错误的举例)

    关于Delphi中的字符串的浅析 只是浅浅的解析下,让大家可以快速的理解字符串. 其中的所有代码均在Delphi7下测试通过. Delphi 4,5,6,7中有字符串类型包括了: 短字符串(Short ...

  7. WebGL自学教程——WebGL演示样本:开始

    最终开始WebGL样品演示,...... 开始 使用WebGL步骤,非常easy: 1. 获得WebGL的渲染环境(也叫渲染上下文). 2. 发挥你的想象力,利用<WebGL參考手冊>中的 ...

  8. Android中日志信息的打印方式

    Android中日志信息的打印方式主要有以下7种: 1)System.out(i级别) 2)System.err(w级别) 3)Log.v 4)Log.d 5)Log.i 6)Log.w 7)Log. ...

  9. windows7 iis安装与配置

    方法/步骤   一. Windows 7环境下的安装配置 打开控制面板——程序和功能   点击左侧“打开或关闭Windows功能”,弹出Windows功能 对话框.   在Windows功能对话框中进 ...

  10. 模拟new实例化对象。

    使用new和字面量的的方法是两种主流创建对象的方法,两种最终都能达到同样的实例化的对象,本章主要围绕new关键字来实例化一个对象并且讲一个不使用new但是完全与new实例化对象相同的例子. 在使用ne ...