一、组合模式简介(Brief Introduction)
组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。二、解决的问题(What To Solve)
解决整合与部分可以被一致对待问题。
三、代码解释
Component:抽象的组件对象,为组合中的对象声明接口,让客户端可以通过这个接口来访问和管理整个对象结构,可以在里面为定义的功能提供缺省的实现
Leaf:叶子节点对象,定义和实现叶子对象的行为,不再包含其他的子节点对象
Composite:组合对象,通常会存储子组件,定义包含子组件的那些组件的行为,并实现在组件接口中定义的与子组件有关的操作
Client:客户端,通过组件接口来操作组合结构里面的组件对象
四、源代码
1、Component代码
/**
**Component:叶子节点和组合节点所用到得接口都在此处定义,为了
**不要区分叶子节点和组合节点(透明性)
**/
class Picture;
class Graphic
{
public:
virtual void draw(){}
virtual void add(Graphic *graphic){}
virtual Picture* getPicture(){return 0;}
};
2、Leaf代码
/**
**Leaf:叶子节点,没有子节点
**/
class Line:public Graphic
{
public:
virtual void draw()
{
std::cout << "draw a line" << endl;
}
};
/**
**Leaf:叶子节点,没有子节点
**/
class Text:public Graphic
{
public:
virtual void draw()
{
std::cout << "draw text" << std::endl;
}
};
3、Composite代码
/**
**Composite:组合节点,存储子部件;子部件可以是叶子节点,也可以本身就是一个组合节点;
**/
class Picture:public Graphic
{
public:
virtual void draw()
{
for(list<Graphic*>::iterator iter = _list.begin();iter != _list.end(); iter++)
{
(*iter)->draw();
}
}
virtual void add(Graphic *graphic)
{
_list.push_back(graphic);
}
virtual Picture* getPicture()
{
return this;
}
virtual ~Picture()
{
for(list<Graphic*>::iterator iter = _list.begin();iter != _list.end(); iter++)
{
delete (*iter);
}
}
private:
list<Graphic*> _list;
};
4、Client代码
Graphic *text = new Text();
Graphic *line = new Line();
Graphic *p = new Picture();
//查看p是否是一个组合,Text,line这种类型的叶子节点没有add操作
//我们是在组合里面,销毁内存的;所以,如果对这些叶子节点执行add操作,会造成内存泄露
if (p->getPicture() != 0)
{
p->add(text);
p->add(line);
}
p->draw();
delete p;