c++设计模式之组合模式

来源:互联网 发布:搜狐产品技术部 java 编辑:程序博客网 时间:2024/05/18 23:26
/************************************************************************//*                             组合模式                                 *//************************************************************************//*假如我们先公司现在的结构如下,  结构图:  -北京市总公司  ---总公司人力资源部  ---总公司财务部  ---青岛市分公司  -----青岛市分公司人力资源部  -----青岛市分公司财务部  -----城阳区办事处  -------城阳区办事处人力资源部  -------城阳区办事处财务部  -----崂山区办事处  -------崂山区办事处人力资源部  -------崂山区办事处财务部*/#include <IOSTREAM>#include <LIST>using namespace std;/*公司类抽象*/class Company{protected:char *name;public:Company(char *name){this->name = name;}virtual void Add(Company *c) {}//增加virtual void Remove(Company *c) {}//移除virtual void Display(int depth) {}//显示virtual void LineOfDuty() {}//履行职责};//具体的公司类(树枝)class ConcreteCompany : public Company{private:list<Company*> *child; public:ConcreteCompany(char *name):Company(name){child = new list<Company*>;}void Add(Company *c){child->push_back(c);}void Remove(Company *c){child->pop_back();}void Display(int depth){int temp = depth;list<Company*>::iterator it = child->begin();while(temp--)cout<<"-";cout<<name<<endl;//显示所有的分支和叶子的名称for(;it!=child->end();it++){(*it)->Display(depth+2);}}//履行职责void LineOfDuty(){list<Company*>::iterator it = child->begin();//显示所有的分支和叶子的名称for(;it!=child->end();it++){//执行分支或叶子的职责(*it)->LineOfDuty();}}};//人力资源部(叶子),叶子中的添加删除函数都是空实现class HRDepartment : public Company{public:HRDepartment(char *name):Company(name){}public:void Add(Company c){}void Remove(Company c){}void Display(int depth){int temp = depth;while(temp--)cout<<"-";cout<<name<<endl;}void LineOfDuty(){cout<<name<<" 员工招聘培训管理"<<endl;}};//财务部class FinanceDeparment : public Company{public:FinanceDeparment(char *name):Company(name){}void Add(Company *c){}void Remove(Company *c){}void Display(int depth){int temp = depth;while(temp--)cout<<"-";cout<<name<<endl;}void LineOfDuty(){cout<<name<<" 公司财务收支管理"<<endl;}};//客户端调用void main(){ConcreteCompany *root = new ConcreteCompany("北京市总公司");root->Add(new HRDepartment("总公司人力资源部"));root->Add(new FinanceDeparment("总公司财务部"));ConcreteCompany *comp = new ConcreteCompany("青岛市分公司");comp->Add(new HRDepartment("青岛市分公司人力资源部"));comp->Add(new FinanceDeparment("青岛市分公司财务部"));root->Add(comp);ConcreteCompany *comp1 = new ConcreteCompany("城阳区办事处");comp1->Add(new HRDepartment("城阳区办事处人力资源部"));comp1->Add(new FinanceDeparment("城阳区办事处财务部"));comp->Add(comp1);//城阳区办事处隶属于青岛市分公司ConcreteCompany *comp2 = new ConcreteCompany("崂山区办事处");comp2->Add(new HRDepartment("崂山区办事处人力资源部"));comp2->Add(new FinanceDeparment("崂山区办事处财务部"));comp->Add(comp2);//城阳区办事处隶属于青岛市分公司cout<<"结构图:"<<endl;root->Display(1);cout<<endl;cout<<endl;cout<<"职责是:"<<endl;root->LineOfDuty();}/*实例应用,如果这家公司让我们为他的不同等级的部门和各公司分别做一套软件而且(假如)上级需要包含下级所具备的功能,那么我们就可以使用组合模式,使用这种模式就大大简化了工作*/


 

 

 

原创粉丝点击