组合模式是一个树状的结构。
component.h
#include <stdio.h>
#include <list>
#include <string>
class CObject
{
public:
CObject(){}
virtual ~CObject(){}
virtual void SetName(std::string aoName){}
virtual std::string GetName(){}
virtual int GetPrice(){}
virtual void SetPrice(int aiPrice){}
virtual int GetotalPrice(){}
virtual void DeleteMalloc(){}
virtual void Add(CObject* aoCObject){}
virtual void Remove(CObject* aoCObject){}
};
class CProduct : public CObject
{
public:
CProduct(){}
virtual ~CProduct(){}
void SetPrice(int aiPrice)
{
miPrice = aiPrice;
}
int GetPrice()
{
return miPrice;
}
void SetName(std::string aoName)
{
moName = aoName;
}
std::string GetName()
{
return moName;
}
private:
int miPrice;
std::string moName;
};
class CBox : public CObject
{
public:
CBox(){}
virtual ~CBox(){}
void Add(CObject* aoCObject)
{
moListObject.push_back(aoCObject);
}
void Remove(CObject* aoCObject)
{
moListObject.remove(aoCObject);
}
void SetName(std::string aoName)
{
moName = aoName;
}
std::string GetName()
{
return moName;
}
int GetotalPrice()
{
int liTotal = 0;
std::list<CObject*>::iterator loIter = moListObject.begin();
for (; loIter != moListObject.end(); ++loIter)
{
CBox* lpcBox = dynamic_cast<CBox*>(*loIter);
CProduct* lpcPro = dynamic_cast<CProduct*>(*loIter);
if (lpcBox != NULL)
{
liTotal += lpcBox->GetotalPrice();
}
else if (lpcPro != NULL)
{
liTotal += lpcPro->GetPrice();
}
}
return liTotal;
}
void DeleteMalloc()
{
std::list<CObject*>::iterator loIter = moListObject.begin();
for (; loIter != moListObject.end(); ++loIter)
{
CBox* lpcBox = dynamic_cast<CBox*>(*loIter);
CProduct* lpcPro = dynamic_cast<CProduct*>(*loIter);
if (lpcBox != NULL)
{
lpcBox->DeleteMalloc();
delete lpcBox;
}
else if (lpcPro != NULL)
{
delete lpcPro;
}
}
}
private:
std::list<CObject*> moListObject;
std::string moName;
};
#include "component.h"
int main(int argv, char* argc[])
{
CObject* lpcObject1 = new CProduct();
lpcObject1->SetName("book");
lpcObject1->SetPrice(10);
CObject* lpcObject2 = new CBox();
lpcObject2->Add(lpcObject1);
lpcObject2->SetName("box1");
CObject* lpcObject3 = new CBox();
lpcObject3->SetName("box2");
CObject* lpcObject4 = new CProduct();
lpcObject4->SetName("book1");
lpcObject4->SetPrice(30);
lpcObject3->Add(lpcObject4);
lpcObject2->Add(lpcObject3);
printf("total price:%d\n", lpcObject2->GetotalPrice());
lpcObject2->DeleteMalloc();
delete lpcObject2;
return 0;
}