设计模式之8 - 组合Composite

        组合模式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);
 }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值