组合模式(Composite)
意图
将对象组合成树形结构以表示"部分-整体"的层次结构。
使得用户对单个对象和组合对象的使用更具有一致性。
类图
参与者
- Component
为组合中的对象声明接口
在适当的情况下,实现所有类共有接口的缺省行为。
声明一个接口用于访问和管理Component的子组件
(可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适情况下实现它。 - Leaf
在组合中表示叶节点对象,叶节点没有子节点。
在组合中定义对象的行为。 - Composite
定义有子部件的的那些部件的行为
存储子部件
在Component接口中实现与子部件有关的操作。 - Client
通过Component接口操纵组合部件的对象
代码:还有错。。。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Component
{
protected:
string name;
public:
virtual void Add(Component *c);
virtual void Remove(Component *c);
virtual void Display(int depth);
Component(string name)
{
this->name = name;
}
};
class Composite:public Component
{
private:
vector<Component *> children;
public:
Composite(string name):Component(name)
{
}
void Add(Component *c)
{
children.push_back(c);
}
void Remove(Component *c)
{
//children.delete(c);
}
void Display(int depth)
{
for(int i=0; i<depth; i++)
cout<<"-";
cout<<name<<endl;
for(vector<Component *>::iterator iter = children.begin(); iter!=children.end(); iter++)
{
(*iter)->Display(depth+2);
}
}
};
class Leaf:public Component
{
public:
Leaf(string name):Component(name)
{
}
void Display(int depth)
{
for(int i=0; i<depth; i++)
cout<<"-";
cout<<name<<endl;
}
};
int main()
{
Composite *root = new Composite("root");
root->Add(new Leaf("Leaf A"));
root->Add(new Leaf("Leaf B"));
Composite *comp = new Composite("Composite X");
comp->Add(new Leaf("Leaf XA"));
comp->Add(new Leaf("Leaf xB"));
root->Add(comp);
root->Display(1);
}