1.说明
请参见本文第一章
2.组合模式说明
组合模式:将对象组合成树形接口以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象具有一致性。
为了保持整体和局部的一致性,整体和局部具有相同的接口,从而避免判断该节点是整体还是局部。接口可以实现为空。
使用范围:在需求中体现部分与整体的层次的接口时,以及你希望用户忽略组合对象与单个对象的不同,同一地使用组合接口中的所有对象时,可以考虑使用组合模式
注意:为了表示在树形中的深度时,会在调用中加入步进,以表示在嵌套的处理过程中的节点深度
3.UML
4.代码
//公司基类
#ifndef __COMPANY_H
#define __COMPANY_H
#include <iostream>
#include <string>
class CCompany
{
public:
CCompany(std::string name)
{
m_name = name;
}
std::string getname()
{
return m_name;
}
virtual void add(CCompany* com)
{
}
virtual void remove(CCompany* com)
{
}
virtual void display(int step) = 0;
virtual void responsibility(int step) = 0;
private:
std::string m_name;
};
#endif
//财政
#ifndef __FINACIAL_H
#define __FINACIAL_H
#include "Company.h"
class CFinacia:public CCompany
{
public:
CFinacia(std::string name):CCompany(name){}
~CFinacia(){}
virtual void display(int step)
{
std::string format;
for (int i=0; i<step; i++)
format += "--";
std::cout<<"cur-dispaly:"<<getname().c_str()<<"##"<<format.c_str()<<std::endl;
}
virtual void responsibility(int step)
{
std::string format;
for (int i=0; i<step; i++)
format += "--";
std::cout<<format.c_str()<<getname().c_str()<<":"<<m_responsibility.c_str()<<std::endl;
}
private:
std::string m_responsibility;
};
#endif
//人事
#ifndef __MANPOWER_H
#define __MANPOWER_H
#include "Company.h"
class CManPower:public CCompany
{
public:
CManPower(std::string name):CCompany(name)
{}
~CManPower(){}
virtual void display(int step)
{
std::string format;
for (int i=0; i<step; i++)
format += "--";
std::cout<<"cur-dispaly:"<<getname().c_str()<<"##"<<format.c_str()<<std::endl;
}
virtual void responsibility(int step)
{
std::string format;
for (int i=0; i<step; i++)
format += "--";
std::cout<<format.c_str()<<getname().c_str()<<":"<<m_responsibility.c_str()<<std::endl;
}
void set_responsibility(std::string bility)
{
m_responsibility = bility;
}
private:
std::string m_responsibility;
};
#endif
//具体公司
#ifndef __REALCOMPANY_H
#define __REALCOMPANY_H
#include <list>
#include "Company.h"
typedef std::list<CCompany*> COMPANLYLIST;
class CRealCompany:public CCompany
{
public:
CRealCompany(std::string name):CCompany(name){}
virtual void add(CCompany* com)
{
m_conlist.push_back(com);
}
virtual void remove(CCompany* com)
{
for (COMPANLYLIST::iterator it=m_conlist.begin(); it!=m_conlist.end(); )
{
if ((*it)->getname() == com->getname())
{
delete *it;
m_conlist.erase(it);
}
else
it++;
}
}
void display(int step)
{
std::string format = "";
for (int i=0; i<step; i++)
format += "--";
std::cout<<"cur-dispaly:"<<getname().c_str()<<"##"<<format.c_str()<<std::endl;
for (COMPANLYLIST::iterator it=m_conlist.begin(); it != m_conlist.end(); it++)
{
(*it)->display(step+1);
}
}
void responsibility(int step)
{
std::string format = "";
for (int i=0; i<step; i++)
format += "--";
std::cout<<"cur-dispaly:"<<getname().c_str()<<"##"<<format.c_str()<<std::endl;
std::cout<<format.c_str()<<m_responsibility.c_str()<<std::endl;
for (COMPANLYLIST::iterator it=m_conlist.begin(); it != m_conlist.end(); it++)
{
(*it)->responsibility(step+1);
}
}
void set_responsibility(std::string bility)
{
m_responsibility = bility;
}
private:
std::string m_responsibility;
COMPANLYLIST m_conlist;
};
#endif
//client调用
#include <iostream>
#include "Company.h"
#include "RealCompany.h"
#include "ManPower.h"
#include "Finacia.h"
int main(void)
{
CCompany* root = new CRealCompany("root");
CCompany* son1 = new CRealCompany("son1");
CCompany* son2 = new CRealCompany("son2");
CCompany* son3 = new CRealCompany("son3");
CCompany* son4 = new CRealCompany("son4");
root->add(son1);
root->add(son2);
root->add(son3);
root->add(son4);
root->display(0);
std::cout<<"===================================================="<<std::endl;
CCompany* son1_p1 = new CManPower("son1_p1");
CCompany* son1_p2 = new CManPower("son1_p2");
CCompany* son1_p3 = new CManPower("son1_p3");
CCompany* son2_p1 = new CManPower("son2_p1");
CCompany* son2_p2 = new CManPower("son2_p2");
son1->add(son1_p1);
son1->add(son1_p2);
son1->add(son1_p3);
son2->add(son2_p1);
son2->add(son2_p2);
CCompany* son1_f1 = new CFinacia("son1_f1");
CCompany* son1_f2 = new CFinacia("son1_f2");
CCompany* son1_f3 = new CFinacia("son1_f3");
CCompany* son2_f1 = new CFinacia("son2_f1");
CCompany* son2_f2 = new CFinacia("son2_f2");
CCompany* son2_f3 = new CFinacia("son2_f3");
CCompany* son2_f4 = new CFinacia("son2_f4");
son1->add(son1_f1);
son1->add(son1_f2);
son1->add(son1_f3);
son2->add(son2_f1);
son2->add(son2_f2);
son2->add(son2_f3);
son2->add(son2_f4);
CCompany* child21 = new CRealCompany("child21");
CCompany* child211 = new CRealCompany("child211");
CCompany* child212 = new CRealCompany("child212");
CCompany* child2121 = new CRealCompany("child2121");
son2->add(child21);
child21->add(child211);
child211->add(child212);
child212->add(child2121);
child2121->add(son1_f1);
child2121->add(son1_p1);
root->display(0);
std::cout<<"===================================================="<<std::endl;
return 0;
}