一、功能
表示“部分-整体”关系,并使用户以一致的方式使用单个对象和组合对象。
二、结构图
上图中,也可以做些扩展,根据需要可以将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;
}