意图:将对象组成树状结构以表示“部分-整体”的层次结构,使得Client对单个对象和组合对象的使用具有一致性。
上下文:在树型结构的问题中,Client必须以不同的方式处理单个对象和组合对象。能否提供一种封装,统一简单元素和复杂元素的概念,让对象容器自己来实现自身的复杂结构,让Client可以像处理简单元素一样来处理复杂元素,从而使Client与复杂元素的内部结构解耦?
Component:为Composite中的对象声明接口;在适当情况下,实现所有类公共接口的默认行为;声明一个接口,用于访问和管理Component的子部件;在递归结构中定义一个接口,用于访问一个父部件,并在适当的情况下实现它。
Leaf:在Composite中表示叶子对象。
Composite:存储子部件,并定义有子部件的那些部件的行为。
Client:通过Component接口操作Composite的对象。
#include
#include
using namespace std;
class Component
{
public:
string name;
Component(string name):name(name){
}
virtual void add(Component *c) = 0;
virtual void remove(Component *c) = 0;
virtual void display(int depth) = 0;
};
class Leaf:public Component
{
public:
// Component interface
Leaf(string name):Component(name){
}
public:
void add(Component *c);
void remove(Component *c);
void display(int depth);
};
void Leaf::add(Component *c )
{
(void)(c);//消除警告
cout << "不能向叶子中添加Component" << endl;
}
void Leaf::remove(Component *c)
{
(void)(c);//Warning
cout << "不能从叶子中删除Component" << endl;
}
void Leaf::display(int depth)
{
cout << string(depth,'-') << this->name << endl;
}
class Composite:public Component
{
public:
list<Component*> children;
// Component interface
Composite(string name):Component(name){
}
public:
void add(Component *c);
void remove(Component *c);
void display(int depth);
};
void Composite::add(Component *c)
{
children.push_back(c);
}
void Composite::remove(Component *c)
{
children.remove(c);
}
void Composite::display(int depth)
{
cout << string(depth,'-') << this->name << endl;
list<Component*>::iterator it;
for(it = children.begin();it != children.end();it++){
Component *c = *it;
c->display(depth + 2);
}
}
int main()
{
Composite *root = new Composite("树干");
root->add(new Leaf("树叶1"));
root->add(new Leaf("树叶2"));
Composite *c1 = new Composite("树枝1");
c1->add(new Leaf("树叶1-1"));
c1->add(new Leaf("树叶1-2"));
root->add(c1);
Composite *c1_1 = new Composite("树枝1-1");
c1_1->add(new Leaf("树叶1-1-1"));
c1_1->add(new Leaf("树叶1-1-2"));
c1->add(c1_1);
root->add(new Leaf("树叶3"));
root->display(1);
return 0;
}
-树干
---树叶1
---树叶2
---树枝1
-----树叶1-1
-----树叶1-2
-----树枝1-1
-------树叶1-1-1
-------树叶1-1-2
---树叶3