• composite模式


      1 #include <iostream>
      2 #include <list>
      3 using namespace std;
      4 //公司类,提供接口,相当于compoent
      5 class Company
      6 {
      7 public:
      8     Company(string name)
      9     {
     10         m_name = name;
     11     }
     12 
     13     virtual ~Company()
     14     {}
     15 
     16     virtual void Add(Company *pCom)
     17     {}
     18 
     19     virtual void Display(int depth)
     20     {}
     21 
     22 protected:
     23     string m_name;
     24 };
     25 
     26 //具体公司,相当于composite
     27 class ConcreteCompany : public Company
     28 {
     29 public:
     30     ConcreteCompany(string name): Company(name)
     31     {}
     32 
     33     virtual ~ConcreteCompany()
     34     {}
     35 
     36     //增加子树或叶子
     37     void Add(Company *pCom)
     38     {
     39         m_listCompany.push_back(pCom);
     40     }
     41 
     42     //显示
     43     void Display(int depth)
     44     {
     45         for(int i = 0;i < depth; i++)
     46         {
     47             cout<<"-";
     48 
     49         }
     50 
     51         cout<< m_name << endl;
     52 
     53         list<Company *>::iterator iter = m_listCompany.begin();
     54 
     55         for(; iter != m_listCompany.end(); iter++) //显示下层结点
     56         {
     57             (*iter)->Display(depth + 2);
     58         }
     59     }
     60 
     61 private:
     62     list<Company *> m_listCompany;
     63 };
     64 
     65 //具体的部门,财务部,相当于leaf
     66 class FinanceDepartment : public Company
     67 {
     68 public:
     69     FinanceDepartment(string name):Company(name)
     70     {}
     71 
     72     virtual ~FinanceDepartment()
     73     {}
     74 
     75     //只需显示,无限添加函数,因为已是叶结点
     76     virtual void Display(int depth)
     77     {
     78         for(int i = 0; i < depth; i++)
     79             cout<<"-";
     80 
     81         cout<< m_name << endl;
     82     }
     83 };
     84 
     85 //具体的部门,人力资源部,相当于leaf
     86 class HRDepartment :public Company
     87 {
     88 public:
     89     HRDepartment(string name):Company(name)
     90     {}
     91 
     92     virtual ~HRDepartment()
     93     {}
     94 
     95     //只需显示,无限添加函数,因为已是叶结点
     96     virtual void Display(int depth)
     97     {
     98         for(int i = 0; i < depth; i++)
     99         {
    100             cout<<"-";
    101         }
    102         cout<< m_name << endl;
    103     }
    104 };
    105 
    106 //////////////////////////////////////////////////////////////////////////
    107 //测试代码
    108 int main()
    109 {
    110     Company *root = new ConcreteCompany("总公司");
    111     Company *leaf1=new FinanceDepartment("财务部");
    112     Company *leaf2=new HRDepartment("人力资源部");
    113     root->Add(leaf1);
    114     root->Add(leaf2);
    115 
    116     //华东分公司
    117     Company *mid1 = new ConcreteCompany("华东分公司");
    118     Company *leaf3=new FinanceDepartment("华东分公司财务部");
    119     Company *leaf4=new HRDepartment("华东分公司人力资源部");
    120     mid1->Add(leaf3);
    121     mid1->Add(leaf4);
    122     root->Add(mid1);
    123 
    124     //南京办事处
    125     Company *mid2=new ConcreteCompany("南京办事处");
    126     FinanceDepartment *leaf5=new FinanceDepartment("南京办事处财务部");
    127     HRDepartment *leaf6=new HRDepartment("南京办事处人力资源部");
    128     mid2->Add(leaf5);
    129     mid2->Add(leaf6);
    130     root->Add(mid2);
    131 
    132     //杭州办事处
    133     Company *mid3=new ConcreteCompany("杭州办事处");
    134     FinanceDepartment *leaf7=new FinanceDepartment("杭州办事处财务部");
    135     HRDepartment *leaf8=new HRDepartment("杭州办事处人力资源部");
    136     mid3->Add(leaf7);
    137     mid3->Add(leaf8);
    138     mid2->Add(mid3);
    139 
    140     root->Display(0);
    141 
    142     delete leaf1;
    143     delete leaf2;
    144     delete leaf3;
    145     delete leaf4;
    146     delete leaf5;
    147     delete leaf6;
    148     delete leaf7;
    149     delete leaf8;
    150     delete mid1;
    151     delete mid2;
    152     delete root;
    153 
    154     return 0;
    155 }
  • 相关阅读:
    用JavaScript+CSS实现Mootools竖排动画菜单
    如何对html:select下拉列表里的数据进行排序
    Work with Unicode, CCSID & DBCS
    学习笔记之搜索引擎—原理、技术与系统
    C#中如何创建文件夹
    学习笔记之Effective C++ 2nd Edition
    Global variables vs. Host variables vs. Parameter markers
    【ZZ】cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
    freopen C/C++文件输入输出利器
    [ZZ]用Eclipse开发C/C++程序的图形化配置
  • 原文地址:https://www.cnblogs.com/kakamilan/p/2602370.html
Copyright © 2020-2023  润新知