Design Patterns 8: Composite

用组合的模式来表达部分-整体的结构关系,使用户可以用单一的方式来对待处理单个和组合后的对象

Design Patterns 8: Composite

#include <list>

struct Component
{
    virtual void Operation() = 0;
    virtual void Add(Component*) {}
    virtual void Remove(Component*) {}
    virtual Component* GetChild(size_t) { return nullptr; }
};

struct Leaf : Component
{
    void Operation() override {}
};

struct Composite : Component
{
    void Operation() override
    {
        for(auto var : children)
        {
            var->Operation();
        }
    }

    void Add(Component* child) override
    {
        children.push_front(child);
    }

    void Remove(Component* child) override
    {
        children.remove(child);
    }

    Component* GetChild(size_t index) override
    {
        if (index >= children.size())
        {
            return nullptr;
        }
        else
        {
            return *(std::next(children.begin(), index));
        }
    }

    std::list<Component*> children;
};

int main()
{
    Composite* comA = new Composite;
    comA->Add(new Leaf);
    comA->Add(new Leaf);

    Composite* comB = new Composite;
    comB->Add(new Leaf);
    comB->Add(new Leaf);
    comB->Add(new Leaf);

    Composite* com = new Composite;
    com->Add(comA);
    com->Add(comB);

    com->Operation();//two Composite::Operation() then five Leaf::Operation() get called
}