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 }

posted on 2012-07-21 15:39  kakamilan  阅读(220)  评论(0编辑  收藏  举报

导航