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

/************************************************************************/
/*                             组合模式                                 */
/************************************************************************/




/*
假如我们先公司现在的结构如下,

  结构图:
  -北京市总公司
  ---总公司人力资源部
  ---总公司财务部
  ---青岛市分公司
  -----青岛市分公司人力资源部
  -----青岛市分公司财务部
  -----城阳区办事处
  -------城阳区办事处人力资源部
  -------城阳区办事处财务部
  -----崂山区办事处
  -------崂山区办事处人力资源部
  -------崂山区办事处财务部


*/



#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();








}



/*
	实例应用,如果这家公司让我们为他的不同等级的部门和各公司分别做一套软件
	而且(假如)上级需要包含下级所具备的功能,那么我们就可以使用组合模式,使用这种模式就大大简化了工作
*/


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值