十五、組合模式

組合模式(Composite)將對象組合成樹形結構以表示“部分--整體”的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。

//Composite.h
#ifndef _COMPOSITE_H_
#define _COMPOSITE_H_
#include <string>
#include <iostream>
#include <vector>
using namespace std;
class Component
{
protected:
	string _name;
public:
	Component(const string& name)
	{
		_name = name;
	}
	virtual void Add(Component* cpt)=0;
	virtual void Remove(Component* cpt)=0;
	virtual void Display(int depth)=0;

};
class Leaf:public Component
{
public:
	Leaf(const string& name):Component(name){}
	void Add(Component* cpt)
	{
		cout<<"Cannot add to a leaf..."<<endl;
	}
	void Remove(Component* cpt)
	{
		cout<<"Cannot remove from a leaf..."<<endl;
	}
	void Display(int depth)
	{
		string temp(depth,'-');
		cout<<temp+_name<<endl;
	}
};
class Composite:public Component
{
private:
	vector<Component*> childrenVec;
	vector<Component*>::iterator it;
public:
	Composite(const string& name):Component(name){}
	void Add(Component* cpt)
	{
		childrenVec.push_back(cpt);
	}
	void Remove(Component* cpt)
	{
		for(it=childrenVec.begin();it!=childrenVec.end();it++)
		{
			if (cpt==(*it))
			{
				childrenVec.erase(it);
			}
		}
		
	}
	void Display(int depth)
	{	
		string temp(depth,'-');
		cout<<temp+_name<<endl;
		for(it=childrenVec.begin();it!=childrenVec.end();it++)
		{
			(*it)->Display(depth+2);
		}
	}
};
#endif

//main.cpp
#include "Composite.h"
int main()
{
	Component* root = new Composite("root");
	root->Add(new Leaf("LeafA"));
	root->Add(new Leaf("LeafB"));

	Composite* comp = new Composite("compositeX");
	comp->Add(new Leaf("LeafXA"));
	comp->Add(new Leaf("LeafXB"));
	root->Add(comp);

	Composite* comp1 = new Composite("compositeXY");
	comp1->Add(new Leaf("LeafXYA"));
	comp1->Add(new Leaf("LeafXYB"));
	comp->Add(comp1);
	root->Add(new Leaf("LeafC"));

	root->Display(1);
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章