c++设计模式概述之组合(composite)

代码写的不够规范,目的是为了缩短代码篇幅, 实际中请不要这样做

 

1、概述

  这里的组合,是将 部分组合到整体。所以, 用到的对象有: 部分、整体。 这里的例子,生活中可以类比厨房的筷筒: 里面放了筷子,勺子。 筷子 勺子就是部分, 整体就是块筒。再比如,冰箱 和放入冰箱的食材, 冰箱就是整体, 放入冰箱的食材就是部分。

  对用户而言,对整体操作而不用关心操作的是具体哪一个对象。这就需要 部分与整体需要拥有对外相同接口。

 

2、代码示例

  下面演示的是水果与果盘的关系。水果准备了 草莓 和 苹果。 这里的水果就是部分,果盘就是整体。

   A、对外的接口类:

class melement
{
public:
    virtual void eat() = 0;
};

    B、苹果类,继承自上面的对外接口类

// apple
class apple : public melement
{
public:
    void eat()
    {
        cout << "\n\n I am eating apple\n\n";
    }
};

  C、草莓类,继承自上面的对外接口类

// strawberry
class strawberry : public melement
{
public:
    void eat()
    {
        cout << "\n\n I am eating strawberry\n\n";
    }
};

  D、果盘类,当然,也需要继承上面的对外接口类,果盘,可以添加和减少水果,额外增加了2个接口

// plate to contain fruits
class plate : public melement
{
public:
    // add a fruit into the plate
    void increase(melement *pele)
    {
        if (pele)
            _list_fruits.push_back(pele);
    }
    
    // away from plate
    void decrease(melement* pele)
    {
        if (pele)
            _list_fruits.remove(pele);
    }


    // show the current fruits
    void eat()
    {
        for each (auto ele in _list_fruits)
        {
            if (ele)
                ele->eat();
        }
    }

private:
    list<melement *> _list_fruits;
};

  

3、调用

  这里,向果盘中添加了4个水果,再吃掉一个。

void call_mode_composite()
{
    const int count_fruits_4 = 4;
    std::unique_ptr<melement> arr_fruits[count_fruits_4];
    std::unique_ptr<plate> pplate(new(std::nothrow) plate);

    if (!pplate )
    {
        cout << "\n\n created plate failed \n\n";
        return;
    }

    // -------------------------------------------------------------------------------
    for (int i = 0; i < count_fruits_4; i++)
    {
        melement *pp = nullptr;
        if (i < 2)
            arr_fruits[i] = std::unique_ptr < melement>(new(std::nothrow) apple);
        else
            arr_fruits[i] = std::unique_ptr < melement>(new(std::nothrow) strawberry);

        pplate->increase(arr_fruits[i].get());
    }

    cout << "before decrease:\n";
    pplate->eat();


    cout << "\n\n after decreasing, eat:\n";
    pplate->decrease(arr_fruits[0].get());
    pplate->eat();
    
}

  输出结果:

 

posted @ 2020-08-12 12:54  mohist  阅读(208)  评论(0编辑  收藏  举报