美文网首页
c++组合模式

c++组合模式

作者: 一路向后 | 来源:发表于2021-02-16 22:06 被阅读0次

    1.组合模式简介

       组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。

    2.源码实现

    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    class ComponentPtr
    {
    protected:
        string m_strName;
    
    public:
        ComponentPtr(string str)
        {
            m_strName = str;
        }
    
        virtual void add(ComponentPtr *p) = 0;
        virtual void remove(ComponentPtr *p) = 0;
        virtual void display() = 0;
    };
    
    class LeafPtr : public ComponentPtr
    {
    public:
        LeafPtr(string str) : ComponentPtr(str){};
    
        void add(ComponentPtr *p)
        {
            cout << "Leaf cannot add" << endl;
        }
    
        void remove(ComponentPtr *p)
        {
            cout << "Leaf cannot remove" << endl;
        }
    
        void display()
        {
            cout << m_strName << endl;
        }
    };
    
    class CompositePtr : public ComponentPtr
    {
    private:
        vector<ComponentPtr *> m_vec;
    
    public:
        CompositePtr(string str) : ComponentPtr(str){};
        ~CompositePtr()
        {
            if(!m_vec.empty())
            {
                m_vec.clear();
            }
        }
    
        void add(ComponentPtr *p)
        {
            m_vec.push_back(p);
        }
    
        void remove(ComponentPtr *p)
        {
            vector<ComponentPtr *>::iterator it;
    
            for(it=m_vec.begin(); it!=m_vec.end(); it++)
            {
                if(*it == p)
                {
                    m_vec.erase(it);
                    break;
                }
            }
        }
    
        void display()
        {
            vector<ComponentPtr *>::iterator it;
    
            for(it=m_vec.begin(); it!=m_vec.end(); it++)
            {
                (*it)->display();
            }
        }
    };
    
    int main(int argc, char **argv)
    {
        ComponentPtr *u[6];
    
        u[0] = new LeafPtr("总部财务部门");
        u[1] = new LeafPtr("总部人力资源部门");
        u[2] = new LeafPtr("上海分部财务部门");
        u[3] = new LeafPtr("上海分部人力资源部门");
        u[4] = new CompositePtr("上海分部");
        u[5] = new CompositePtr("总部");
    
        CompositePtr *p = (CompositePtr *)u[5];
        p->add(u[0]);
        p->add(u[1]);
        CompositePtr *p1 = (CompositePtr *)u[4];
        p1->add(u[2]);
        p1->add(u[3]);
        p->add(p1);
    
        p->display();
    
        delete u[0];
        delete u[1];
        delete u[2];
        delete u[3];
        delete u[4];
        delete u[5];
    
        return 0;
    }
    

    3.编译源码

    $ g++ -o example example.cpp
    

    4.运行及其结果

    $ ./example
    总部财务部门
    总部人力资源部门
    上海分部财务部门
    上海分部人力资源部门
    

    相关文章

      网友评论

          本文标题:c++组合模式

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