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

来源:互联网 发布:excel编程容易找工作吗 编辑:程序博客网 时间:2024/05/16 08:29

一、功能

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

二、结构图

  上图中,也可以做些扩展,根据需要可以将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;}


原创粉丝点击