组合模式(Composite)将对象组合成树形结构以表示“部分--整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
//Composite.h
#ifndef _COMPOSITE_H_
#define _COMPOSITE_H_
#include <string>
#include <iostream>
#include <vector>
using namespace std;
class Component
{
protected:
string _name;
public:
Component(const string& name)
{
_name = name;
}
virtual void Add(Component* cpt)=0;
virtual void Remove(Component* cpt)=0;
virtual void Display(int depth)=0;
};
class Leaf:public Component
{
public:
Leaf(const string& name):Component(name){}
void Add(Component* cpt)
{
cout<<"Cannot add to a leaf..."<<endl;
}
void Remove(Component* cpt)
{
cout<<"Cannot remove from a leaf..."<<endl;
}
void Display(int depth)
{
string temp(depth,'-');
cout<<temp+_name<<endl;
}
};
class Composite:public Component
{
private:
vector<Component*> childrenVec;
vector<Component*>::iterator it;
public:
Composite(const string& name):Component(name){}
void Add(Component* cpt)
{
childrenVec.push_back(cpt);
}
void Remove(Component* cpt)
{
for(it=childrenVec.begin();it!=childrenVec.end();it++)
{
if (cpt==(*it))
{
childrenVec.erase(it);
}
}
}
void Display(int depth)
{
string temp(depth,'-');
cout<<temp+_name<<endl;
for(it=childrenVec.begin();it!=childrenVec.end();it++)
{
(*it)->Display(depth+2);
}
}
};
#endif
//main.cpp
#include "Composite.h"
int main()
{
Component* root = new Composite("root");
root->Add(new Leaf("LeafA"));
root->Add(new Leaf("LeafB"));
Composite* comp = new Composite("compositeX");
comp->Add(new Leaf("LeafXA"));
comp->Add(new Leaf("LeafXB"));
root->Add(comp);
Composite* comp1 = new Composite("compositeXY");
comp1->Add(new Leaf("LeafXYA"));
comp1->Add(new Leaf("LeafXYB"));
comp->Add(comp1);
root->Add(new Leaf("LeafC"));
root->Display(1);
return 0;
}