GreensnoWorld
记录点滴,分享乐趣,一块凝固的时间
2007.组合模式
设计模式  2023年7月24日
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Component
{
public:
	Component(string name): m_strCompname(name){}
	virtual ~Component(){}
	virtual void Operation()=0;
	virtual void Add(Component *)=0;
	virtual void Remove(Component *)=0;
	virtual Component *GetChild(int)=0;
	virtual string GetName()
	{
		return m_strCompname;
	}
	virtual void Print() = 0;
protected:
	string m_strCompname;
};
class Leaf: public Component
{
public:
	Leaf(string name): Component(name){}
	void Operation()
	{
		cout << "I'm " << m_strCompname << endl;
	}
	void Add(Component *pComponent){}
	void Remove(Component *pComponent){}
	Component *GetChild(int index)
	{
		return NULL;
	}
	void Print(){}
};
class Composite: public Component
{
public:
	Composite(string name): Component(name){}
	~Composite()
	{
		vector<Component *>::iterator it = m_vecComp.begin();
		while(it != m_vecComp.end())
		{
			if(*it != NULL)
			{
				cout << "----delete " << (*it)->GetName() << "----" << endl;
				delete *it;
				*it = NULL;
			}
			m_vecComp.erase(it);
			it = m_vecComp.begin();
		}
	}
	void Operation()
	{
		cout << "I'm " << m_strCompname << endl;
	}
	void Add(Component *pComponent)
	{
		m_vecComp.push_back(pComponent);
	}
	void Remove(Component *pComponent)
	{
		for(vector<Component *>::iterator it=m_vecComp.begin(); it!=m_vecComp.end(); it++)
		{
			if((*it)->GetName() == pComponent->GetName())
			{
				if(*it != NULL)
				{
					delete *it;
					*it = NULL;
				}
				m_vecComp.erase(it);
				break;
			}
		}
	}
	Component *GetChild(int index)
	{
		if(index > m_vecComp.size())
		{
			return NULL;
		}
		return m_vecComp[index - 1];
	}
	void Print()
	{
		for(vector<Component *>::iterator it=m_vecComp.begin(); it!=m_vecComp.end(); it++)
		{
			cout << (*it)->GetName() << endl;
		}
	}
private:
	vector<Component *> m_vecComp;
};

int main(int argc, char *argv[])
{
	Component *pNode = new Composite("Beijing Head Office");
	Component *pNodeHr = new Leaf("Beijing Human Resources Department");
	Component *pSubNodeSh = new Composite("Shanghai Branch");
	Component *pSubNodeCd = new Composite("Chengdu Branch");
	Component *pSubNodeBt = new Composite("Baotou Branch");
	pNode->Add(pNodeHr);
	pNode->Add(pSubNodeSh);
	pNode->Add(pSubNodeCd);
	pNode->Add(pSubNodeBt);
	pNode->Print();
	Component *pSubNodeShHr = new Leaf("Shanghai Human Resources Department");
	Component *pSubNodeShCg = new Leaf("Shanghai Purchasing Department");
	Component *pSubNodeShXs = new Leaf("Shanghai Sales Department");
	Component *pSubNodeShZb = new Leaf("Shanghai Quality Supervision Department");
	pSubNodeSh->Add(pSubNodeShHr);
	pSubNodeSh->Add(pSubNodeShCg);
	pSubNodeSh->Add(pSubNodeShXs);
	pSubNodeSh->Add(pSubNodeShZb);
	pNode->Print();

	pSubNodeSh->Remove(pSubNodeShZb);
	if(pNode != NULL)
	{
		delete pNode;
		pNode = NULL;
	}
	return 0;
}

 

LIJG
余本顽劣,生于紫云下,长于汝水滨。早年求学,兴趣广泛,好高骛远,学无所成,仓皇入世。兴趣所致,投身互联网,求知未证,而立已至,始悟光阴荏苒,终需务实钻研。故有此站,记录时光,积累点滴,验证所学,分享愚见。指舞方寸间,心系万千年。
留言