zoukankan      html  css  js  c++  java
  • 015 --- 第19章 组合模式

    简述:

      组合模式:将对象组合成树形结构以表示‘部分 - 整体‘的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

      组合模式包括:树类、枝类、叶类。

        树类:组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理枝的子部件。

        枝类:定义有枝节点的行为,用来存储子部件,在树类接口中实现与子部件有关的操作。

        叶类:在组合中表示叶节点对象,叶节点没有子节点。

    组合模式:

      1 #include <iostream>
      2 #include <string>
      3 #include <list>
      4 using namespace std;
      5 
      6 // 树类
      7 class CComponent
      8 {
      9 protected:
     10     string m_szName;
     11 
     12 public:
     13     CComponent(string szName) { m_szName = szName; }
     14 
     15     virtual void Add(CComponent* pComponent) = 0;
     16     virtual void Remove(CComponent* pComponent) = 0;
     17     virtual void Display(int nDepth) = 0;
     18 };
     19 
     20 // 叶类
     21 class CLeaf : public CComponent
     22 {
     23 public:
     24     CLeaf(string szName) : CComponent(szName) {}
     25 
     26     void Add(CComponent* pComponent)
     27     {
     28         cout << "叶子结点不能增加子节点" << endl;
     29     }
     30 
     31     void Remove(CComponent* pComponent)
     32     {
     33         cout << "叶子结点不能删除子节点" << endl;
     34     }
     35 
     36     void Display(int nDepth)
     37     {
     38         string str(nDepth, '-');
     39         
     40         cout << str << m_szName << endl;
     41     }
     42 };
     43 
     44 // 枝类
     45 class CComposite : public CComponent
     46 {
     47 private:
     48     list<CComponent*> m_lstChildren;
     49 
     50 public:
     51     CComposite(string szName) : CComponent(szName) {};
     52 
     53     void Add(CComponent* pComponent) { m_lstChildren.push_back(pComponent); }
     54 
     55     void Remove(CComponent* pComponent) { m_lstChildren.remove(pComponent); }
     56 
     57     void Display(int nDepth)
     58     {
     59         string str(nDepth, '-');
     60 
     61         cout << str << m_szName << endl;
     62 
     63         for (CComponent* pComponent : m_lstChildren)
     64             pComponent->Display(nDepth + 2);
     65     }
     66 };
     67 
     68 int main()
     69 {
     70     CComposite root("root");
     71     CLeaf LeafA("Leaf A");
     72     root.Add(&LeafA);
     73     CLeaf LeafB("Leaf B");
     74     root.Add(&LeafB);
     75 
     76     CComposite compX("Composite X");
     77     CLeaf LeafXA("Leaf XA");
     78     compX.Add(&LeafXA);
     79     CLeaf LeafXB("Leaf XB");
     80     compX.Add(&LeafXB);
     81     root.Add(&compX);
     82 
     83     CComposite compY("Composite Y");
     84     CLeaf LeafYA("Leaf YA");
     85     compY.Add(&LeafYA);
     86     CLeaf LeafYB("Leaf YB");
     87     compY.Add(&LeafYB);
     88     root.Add(&compY);
     89 
     90     CLeaf LeafC("Leaf C");
     91     root.Add(&LeafC);
     92 
     93     CLeaf LeafD("Leaf D");
     94     root.Add(&LeafD);
     95     root.Remove(&LeafD);
     96 
     97     CLeaf LeafE("Leaf E");
     98     LeafD.Add(&LeafE);
     99 
    100     root.Display(1);
    101 
    102     system("pause");
    103     return 0;
    104 }

    输出结果:

    例:公司组织结构

    代码如下:

    #include <iostream>
    #include <string>
    #include <list>
    using namespace std;
    
    // 抽象公司类(树类)
    class CCompany
    {
    protected:
        string m_szName;
    
    public:
        CCompany(string szName) { m_szName = szName; }
    
        virtual void Add(CCompany* pCompany) = 0;
        virtual void Remove(CCompany* pCompan) = 0;
        virtual void Display(int nDepth) = 0;
        virtual void LineOfDuty() = 0;
    };
    
    // 具体公司类(枝类)
    class CConcreteCompany : public CCompany
    {
    private:
        list<CCompany*> m_lstChildren;
    
    public:
        CConcreteCompany(string szName) : CCompany(szName) {}
    
        virtual void Add(CCompany* pCompany) { m_lstChildren.push_back(pCompany); }
    
        virtual void Remove(CCompany* pCompany) { m_lstChildren.remove(pCompany); }
        virtual void Display(int nDepth)
        {
            string str(nDepth, '-');
            
            cout << str << m_szName << endl;
            
            for (CCompany* pCompany : m_lstChildren)
                pCompany->Display(nDepth + 2);
        }
    
        virtual void LineOfDuty()
        {
            for (CCompany* pCompany : m_lstChildren)
                pCompany->LineOfDuty();
        }
    };
    
    // 人力资源部(叶类)
    class CHRDepartment : public CCompany
    {
    public:
        CHRDepartment(string szName) : CCompany(szName) {}
    
        virtual void Add(CCompany* pCompany) {}
    
        virtual void Remove(CCompany* pCompany) {}
    
        virtual void Display(int nDepth)
        {
            string str(nDepth, '-');
    
            cout << str << m_szName << endl;
        }
    
        virtual void LineOfDuty()
        {
            cout << m_szName << ":员工招聘培训管理" << endl;
        }
    };
    
    // 财务部
    class CFinanceDepartment : public CCompany
    {
    public:
        CFinanceDepartment(string szName) : CCompany(szName) {}
    
        virtual void Add(CCompany* pCompany) {}
    
        virtual void Remove(CCompany* pCompany) {}
    
        virtual void Display(int nDepth)
        {
            string str(nDepth, '-');
    
            cout << str << m_szName << endl;
        }
    
        virtual void LineOfDuty()
        {
            cout << m_szName << ":公司财务收支管理" << endl;
        }
    };
    
    
    int main()
    {
        CConcreteCompany root("北京总公司");
        CHRDepartment HRDepartment1("总公司人力资源部");
        root.Add(&HRDepartment1);
        CFinanceDepartment FinanceDepartment1("总公司财务部");
        root.Add(&FinanceDepartment1);
    
        CConcreteCompany comp("上海华东分公司");
        CHRDepartment HRDepartment2("华东分公司人力资源部");
        comp.Add(&HRDepartment2);
        CFinanceDepartment FinanceDepartment2("华东分公司财务部");
        comp.Add(&FinanceDepartment2);
        root.Add(&comp);
    
        CConcreteCompany comp1("南京办事处");
        CHRDepartment HRDepartment3("南京办事处人力资源部");
        comp1.Add(&HRDepartment3);
        CFinanceDepartment FinanceDepartment3("南京办事处财务部");
        comp1.Add(&FinanceDepartment3);
        root.Add(&comp1);
    
        CConcreteCompany comp2("杭州办事处");
        CHRDepartment HRDepartment4("杭州办事处人力资源部");
        comp2.Add(&HRDepartment4);
        CFinanceDepartment FinanceDepartment4("杭州办事处财务部");
        comp2.Add(&FinanceDepartment4);
        root.Add(&comp2);
    
        cout << endl << "结构图:" << endl;
        root.Display(1);
    
        cout << endl << "职责:" << endl;
        root.LineOfDuty();
    
        system("pause");
        return 0;
    }

    输出结果:

  • 相关阅读:
    模拟登陆江西理工大学教务系统
    python3爬虫 -----华东交大校园新闻爬取与数据分析
    以selenium模拟登陆12306
    PAT (Basic Level) Practice (中文)1076 Wifi密码 (15 分)
    PAT (Basic Level) Practice (中文)1047 编程团体赛 (20 分)
    PAT (Basic Level) Practice (中文)1029 旧键盘 (20 分)
    PAT (Basic Level) Practice (中文)1016 部分A+B (15 分)
    PAT (Basic Level) Practice (中文)1031 查验身份证 (15 分)
    PAT (Basic Level) Practice (中文)1041 考试座位号 (15 分)
    PAT (Basic Level) Practice (中文)1037 在霍格沃茨找零钱 (20 分)
  • 原文地址:https://www.cnblogs.com/SmallAndGreat/p/13614185.html
Copyright © 2011-2022 走看看