组合模式Composite 也称为 整体-部分 模式,用户可以通过一致的方式 整体调用。
组合模式特点可以概括为两点:
1. 复杂对象对于简单对象的组合;
2. 统一的对象接口,方便抽象的整体调用;
对于第一点,从学习面向对象开始,组合模式 就表达了最基本的封装的概念,这个意义上组合模式太简单,简单到和人要吃饭睡觉一样,或者说其本身并不算一种模式。
第二点抽象,单独来看也就是继承,是面向对象的一个基本概念,比如 抽象类 Graphics(可能分为 点、线、圆、矩形等等),包含统一的接口(比如绘制、平移、旋转等)。
组合模式 的价值(或者核心)就在于将这两点进行统一,对于上面的例子就是 定义一种复杂图形(就是组合对象),包含多个子对象(比如 同心圆 由两个圆组合而成),将组合对象和简单对象进行一致处理。
来看组合模式的类结构图:
// 抽象的部件类描述将来所有部件共有的行为
class Component
{
public:
// 添加部件
virtual void Add(Component component);
// 删除部件
virtual void Remove(Component component);
std::string m_strName;
};
// 组合部件类
class Leaf : public Component
{
// 叶子节点不具备添加的能力,不实现
virtual void Add(Component component)
{
}
// 叶子节点不具备添加的能力必然也不能删除
virtual void Remove(Component component)
{
}
};
// 组合类
class Composite : public Component
{
public:
// 添加节点 添加部件
virtual void Add(Component component)
{
m_vecComponent.push_back(component);
}
// 删除节点 删除部件
virtual void Remove(Component component)
{
// erase
}
protected:
//用来保存组合的部件
vector<Component> m_vecComponent;
};
void main(char* args)
{
// 构造根节点
Composite root;
root.m_strName = "根节点";
// 添加子节点leaf
Leaf l_1;
l_1.m_strName = "叶节点一";
Leaf l_2;
l_2.m_strName = "叶节点二";
root.Add(l_1);
root.Add(l_2);
}