对象结构型——组合模式(Composite)

一、功能

表示“部分-整体”关系,并使用户以一致的方式使用单个对象和组合对象。

二、结构图

  上图中,也可以做些扩展,根据需要可以将Leaf和Composite做为抽象基类,从中派生出子类来。

三、优缺点

  优点:对于Composite模式,也许人们一开始的注意力会集中在它是如何实现组合对象的。但Composite最重要之处在于用户并不关心是组合对象还是单个对象,用户将以统一的方式进行处理,所以基类应是从单个对象和组合对象中提出的公共接口。
  缺点:Composite最大的问题在于不容易限制组合中的组件。 

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

class Component
{
public:
	Component()	{}
	virtual void Operation()=0;
	virtual void Add(Component *PChild){}  
	virtual void Remove(Component *PChild){}  
	virtual Component* GetChild(int index)
	{  
		return NULL;
	}
};
class Leaf:public Component
{
public:
	Leaf(){}
	virtual void Operation()
	{
		cout<<"Operation by Leaf"<<endl;
	}
};
class Composite:public Component
{
public:
	Composite(){}
	~Composite()
	{
		list<Component*>::iterator iter1,temp;
		for(iter1=m_ListOfComponent.begin();iter1!=m_ListOfComponent.end();)
		{
			temp=iter1;
			iter1++;
			delete(*temp);
		}
	}
	virtual void Operation()
	{
		cout<<"Operation by Composite"<<endl;
		list<Component*>::iterator iter1;
		for(iter1=m_ListOfComponent.begin();iter1!=m_ListOfComponent.end();iter1++)
		{
			(*iter1)->Operation();
		}

	}
	virtual void Add(Component *pChild)
	{
		m_ListOfComponent.push_back(pChild);
	}  
	virtual void Remove(Component *pChild)
	{
		list<Component*>::iterator iter;
		iter=find(m_ListOfComponent.begin(),m_ListOfComponent.end(),pChild);
		if(m_ListOfComponent.end()!=iter)
		{ 
			m_ListOfComponent.erase(iter);
		}
	} 
	virtual Component* GetChild(int index)
	{  
		if( index<=0 || index> m_ListOfComponent.size())
			return NULL;
		list<Component*>::iterator iter1,iter2;
		int i;
		for(i=1,iter1=m_ListOfComponent.begin(),iter2=m_ListOfComponent.end(); iter1!=iter2;++iter1,++i)
		{
			if (i==index)
				break;
		}
		return *iter1;
	}
private:
	list<Component*> m_ListOfComponent;
};

int main()
{   
	Leaf *pLeaf1 = new Leaf();
	Leaf *pLeaf2 = new Leaf();

	Composite* pComposite = new Composite();
	pComposite->Add(pLeaf1);
	pComposite->Add(pLeaf2);
	pComposite->Operation();
	pComposite->GetChild(2)->Operation();

	delete pComposite;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值