设计模式-组合模式

组合模式结构图

 意图:将对象组合成树型结构以表示“部分-整体”的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。

设计模式-组合模式_第1张图片

其中:

  • Component为组合中的对象声明接口;在适当情况下实现所有类共有接口的默认行为;声明一个接口用于访问和管理Component的子组件;(可选)在递归结构中定义一个接口,用于访问一个父组件,并在合适的情况下实现它。 
  • Leaf在组合中表示叶结点对象,叶结点没有子结点;在组合中定义图元对象的行为。
  • Composite定义有子组件的那些组件的行为;存储子组件;在Component接口中实现与子组件有关的操作。
  • Client通过Component接口操纵组合组件的对象。

应用举例

公司的组成。

 

#include 
#include 
#include 
using namespace std;

//抽象类,提供接口
class Company
{
public:
	Company(string name) { m_name = name; }
	virtual ~Company() {}
	virtual void Add(Company *pCom) {}
	virtual void Show(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 Show(int depth)
	{
		for (int i = 0; i < depth; i++)
		{
			cout << "-";
		}
		cout << m_name << endl;
		list::iterator  iter = m_listCompany.begin();

		//显示下层结点
		for (; iter != m_listCompany.end(); iter++)
		{
			(*iter)->Show(depth + 2);
		}
	}
private:
	list m_listCompany;
};

//具体的部门,财务部
class FinanceDepartment : public Company
{
public:
	 FinanceDepartment(string name) :Company(name) {}
	 virtual ~FinanceDepartment() {}
	 //只需显示,无限添加函数,因为已是叶结点
	 virtual void Show(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 Show(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);

	//分公司A
	Company *mid1 = new ConcreteCompany("分公司A");
	Company *leaf3 = new FinanceDepartment("财务部");
	Company *leaf4 = new HRDepartment("人力资源部");
	mid1->Add(leaf3);
	mid1->Add(leaf4);
	root->Add(mid1);

	//分公司B
	Company *mid2 = new ConcreteCompany("分公司B");
	FinanceDepartment *leaf5 = new FinanceDepartment("财务部");
	HRDepartment *leaf6 = new HRDepartment("人力资源部");
	mid2->Add(leaf5);
	mid2->Add(leaf6);
	root->Add(mid2);

	root->Show(0);

	getchar();
	return 0;
}

适用性

  • 想表示对象的部分-整体层次结构
  • 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。 

你可能感兴趣的:(设计模式)