美文网首页
结构型模式2-组合模式

结构型模式2-组合模式

作者: sunblog | 来源:发表于2018-04-16 23:09 被阅读0次

    结构型模式2-组合模式

    组合模式Composite

    意图

    将对象组合成属性结构,以表示“部分-整体”的层次结构。composite是的用户对单个对象和组合对象的使用具有一致性。

    问题思考

    考虑一个容器view,比如listview,包含了很多子view。listview本身也包含在了其他的容器view里,比如GridView。我们的窗口Window如果在这里区分是simple View、listview还是gridview,是没有必要的。window仅需要知道这是个view,知道怎么draw它就可以。

    适用性

    • 想表示对象的部分-整体层次结构
    • 希望忽略组合对象和单个对象的不同,希望统一地使用组合结构中的所有对象。

    类图

    composite

    实现

    class Component {
    public:
        virtual void Operation() = 0;
    
        virtual void Add(Component *) {};
    
        virtual void Remove(Component *) {};
    
        virtual Component *GetChild(int n) {};
    };
    
    class Composite : public Component {
    public:
        void Operation() override {
            for (auto &e: mComponentList) {
                e->Operation();
            }
        }
    
        void Add(Component *component) override {
            for (auto &it : mComponentList) {
                if (it == component) {
                    return;     // avoid duplication
                }
            }
            mComponentList.push_back(component);
        }
    
        void Remove(Component *component) override {
            // different
            for (auto it = mComponentList.begin(); it != mComponentList.end(); it++) {
                if (*it == component) {
                    mComponentList.erase(it);
                    return;
                }
            }
        }
    
        Component *GetChild(int n) override {
            if (mComponentList.size() > n) {
                return mComponentList.at(n);
            }
            return nullptr;
        }
    
    private:
        std::vector<Component*> mComponentList;
    };
    
    class ConcreteComponent : public Component {
    public:
        void Operation() override {
            // some operations
        }
    };
    
    

    注意:对于普通的component(非组合composite),Add,Remove,Get 这几个composite专属操作是无意义的,但为了保持接口统一,所以仍然存在。在这里我们普通component的对应的方法为空实现。

    相关文章

      网友评论

          本文标题:结构型模式2-组合模式

          本文链接:https://www.haomeiwen.com/subject/ghpykftx.html