意图
将对象组合成树形结构以表示"部分-整体"的层次结构。
使得用户对单个对象和组合对象的使用更具有一致性。
类图
参与者
- 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);
}
# 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);
}