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;
    }

    输出结果:

  • 相关阅读:
    Java 基本知识
    开源框架 Java
    Java 常用工具
    centos7设置静态IP
    VMnet1、VMnet8到底是什么?
    centos7修改主机名的方法
    防火墙阻止了虚拟机与主机之间互相ping通解决方案
    虚拟机centos与主机互相Ping通
    centos个性化命令行提示符
    更多的常用命令
  • 原文地址:https://www.cnblogs.com/SmallAndGreat/p/13614185.html
Copyright © 2011-2022 走看看