考虑一个树状层次结构,包含了3种节点,根节点,中间节点,以及叶子节点。对于中间节点,提供接口遍历他的子节点,而叶子节点则不需要。但有时需将中间节点和叶子节点的操作统一起来。例如在一个图形绘制的程序中,一幅图可有点,线,多边形,文字这样图元构成,同时若干个图元也可合在一块统一视作一个图元。基本图元视作一个实体类,而多个图元合在一块的对象则视为一个容器类,要将2者的操作统一起来,就可以采用组合模式。具体实现是让实体类和容器类对象派生于同一个基类,在基类中定义统一的操作接口。结构图如下:
Component:为组合中的对象生命接口
在适当情况下,实现所有类共有的接口的缺省行为
声明一个接口用于访问和管理Component的子组件
在递归结构中定义一个接口,用于访问一个父部件。
Leaf:在组合中表示叶节点对象
Composite:定义所有子部件的行为,实现与子部件相关的操作。
Composite实现任意组合方式构建定制新的Component。
代码示例:
class component {
public:
virtual composite* getComposite() { return 0; }
virtual void print(){ };
};
class leaf :public component {
public:
void print() { printf("leaf\n");}
};
class composite : public component{
public:
composite* getComposite() { return this; };
void addComponent(component *com ) { if(com) _components.push_back(com); };
void print(){
if(_components.size()==0)
{
printf("empty composite\n");
return ;
}
for (list<component*>::iterator i=_components.begin();i!=_components.end();i++)
{
(*i)->print();
}
};
private:
list<component*> _components;
};