Composite模式
一.意图
将对象组合成树形结构以表示”部分-整体”的层次结构,composite使得用户对单个对象和组合对象的使用具有一致性.
二.适用性
1. 你想表示对象的部分-整体层次结构
2. 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象
三.结构
四.代码
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
usingnamespacestd;
//compositemode
classCComponent
{
public:
virtualvoidDisplayOperation(){}
virtualvoidAdd(CComponent*component){}
virtualvoidRemove(CComponent*component){}
virtualstringGetName(){}
virtualintGetType(){}
};
#defineCOMPOSITENUM 10
classCComposite:publicCComponent
{
private:
stringm_name="NULLNAME";
intm_index=0;
CComposite**m_pArray=NULL;
intm_type=0;
public:
CComposite(stringname)
{
m_name=name;
m_pArray=(CComposite**)malloc(sizeof(CComposite*)*COMPOSITENUM);
}
~CComposite()
{
if(m_pArray!=NULL)
{
deletem_pArray;
m_pArray=NULL;
}
}
voidAdd(CComponent*component)
{
if(m_index<COMPOSITENUM)
{
m_pArray[m_index]=(CComposite*)component;
m_index++;
}
else
{
cout<<"maxindex!"<<endl;
}
}
stringGetName()
{
returnm_name;
}
intGetType()
{
returnm_type;
}
voidDisplayOperation()
{
cout<<"displaycompositebegin:name="<<m_name<<"type="<<m_type<<endl;
for(inti=0;i<m_index;i++)
{
cout<<"i="<<i<<"name="<<m_pArray[i]->GetName()<<"type="<<m_pArray[i]->GetType()<<endl;
}
cout<<"displaycompositeend"<<endl;
}
};
classCLeaf:publicCComponent
{
public:
CLeaf(stringname)
{
m_name=name;
}
stringGetName()
{
returnm_name;
}
intGetType()
{
returnm_type;
}
voidDisplayOperation()
{
cout<<"leafname="<<GetName()<<"type="<<m_type<<endl;
}
private:
stringm_name="NULLNAME";
intm_type=1;
};
intmain()
{
cout<<"HelloWorld!"<<endl;
CComponent*composite1=newCComposite("composite1");
CComponent*composite2=newCComposite("composite2");
CComponent*composite3=newCComposite("composite3");
CComponent*leaf1=newCLeaf("leaf1");
CComponent*leaf2=newCLeaf("leaf2");
CComponent*leaf3=newCLeaf("leaf3");
composite1->Add(leaf1);
composite1->Add(leaf2);
composite1->DisplayOperation();
composite2->Add(leaf3);
composite3->Add(composite1);
composite3->Add(composite2);
composite3->DisplayOperation();
return0;
}