背景:常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些数据结构,将极大地破坏组件的复用。这时候,将这些特定的数据结构封装在内部,在外部提供统一的接口,来实现与特定数据无关的访问,是一种行之有效的解决方案。
模式定义:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
class Component
{
public:
virtual ~Component() = 0;
virtual void process() = 0;
};
//父节点
class Composite : public Component
{
protected:
typedef list<Component*> ComponetList;
typedef ComponetList::iterator iterator;
ComponetList mComponentList;
public:
virtual void process()
{
for (iterator i = mComponentList.begin(); i != mComponentList.end(); i++)
{
(*i)->process();
}
}
void addComponent(Component* p)
{
mComponentList.push_back(p);
}
};
//叶子节点
class Leaf : public Component
{
public:
virtual void process()
{
//doSomething
}
};
总结:
1.Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化为“一对一”的关系,使得客户代码可以一致地(复用)处理对象和对象容器,{这个在命令者模式中可以一起用}无需关心处理的是单个对象,还是组合的对象容器。
2.将“客户代码与复杂的对象容器结构”解耦是Composite的核心思想,解耦之后,客户端代码将于纯粹的抽象接口——而非对象容器的内部实现——发生依赖,从而更能“应对变化”。
3.Composite模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率。(这里我想大概是在管理类中,用一个容器存储用的较多的父节点)。