1. 程式人生 > >C++設計模式之組合模式

C++設計模式之組合模式

層次 concrete 鏈表 show 中間 圖片 push_back 用戶 tchar

DP書上給出的定義:將對象組合成樹形結構以表示“部分-整體”的層次結構。組合使得用戶對單個對象和組合對象的使用具有一致性。註意兩個字“樹形”。這種樹形結構在現實生活中隨處可見,比如一個集團公司,它有一個母公司,下設很多家子公司。不管是母公司還是子公司,都有各自直屬的財務部、人力資源部、銷售部等。對於母公司來說,不論是子公司,還是直屬的財務部、人力資源部,都是它的部門。整個公司的部門拓撲圖就是一個樹形結構。

下面給出組合模式的UML圖。從圖中可以看到,FinanceDepartment、HRDepartment兩個類作為葉結點,因此沒有定義添加函數。而ConcreteCompany類可以作為中間結點,所以可以有添加函數。那麽怎麽添加呢?這個類中定義了一個鏈表,用來放添加的元素。

技術分享圖片

  1 // Composite.cpp : 定義控制臺應用程序的入口點。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include<iostream>
  6 #include<string>
  7 #include <vector>
  8 #include <list>
  9 using namespace std;
 10 
 11 class Company
 12 {
 13 public:
 14     Company(string name)
 15     {
 16         m_name = name;
17 } 18 virtual ~Company() {} 19 virtual void Add(Company *pCom) {} 20 virtual void Show(int depth) {} 21 protected: 22 string m_name; 23 }; 24 25 class ConcreteCompany : public Company 26 { 27 public: 28 ConcreteCompany(string name):Company(name) {} 29 virtual
~ConcreteCompany() {} 30 void Add(Company *pCom) {m_listCompany.push_back(pCom);} 31 32 void Show(int depth) 33 { 34 for(int i = 0;i < depth; i++) 35 cout<<"-"; 36 cout<<m_name<<endl; 37 list<Company *>::iterator iter=m_listCompany.begin(); 38 for(; iter != m_listCompany.end(); iter++) //顯示下層結點 39 (*iter)->Show(depth + 2); 40 } 41 private: 42 list<Company*> m_listCompany; 43 44 }; 45 46 //具體的部門,財務部 47 48 class FinanceDepartment : public Company 49 { 50 public: 51 FinanceDepartment(string name):Company(name){} 52 virtual ~FinanceDepartment() {} 53 virtual void Show(int depth) //只需顯示,無限添加函數,因為已是葉結點 54 { 55 for(int i = 0; i < depth; i++) 56 cout<<"-"; 57 cout<<m_name<<endl; 58 } 59 }; 60 61 class HRDepartment:public Company 62 { 63 public: 64 HRDepartment(string name):Company(name){} 65 virtual ~HRDepartment() {} 66 virtual void Show(int depth) 67 { 68 for(int i = 0; i < depth; i++) 69 cout<<"-"; 70 cout<<m_name<<endl; 71 } 72 }; 73 74 int _tmain(int argc, _TCHAR* argv[]) 75 { 76 Company *root = new ConcreteCompany("總公司"); 77 Company *leaf1=new FinanceDepartment("財務部"); 78 Company *leaf2=new HRDepartment("人力資源部"); 79 root->Add(leaf1); 80 root->Add(leaf2); 81 //分公司A 82 Company *mid1 = new ConcreteCompany("分公司A"); 83 Company *leaf3=new FinanceDepartment("財務部"); 84 Company *leaf4=new HRDepartment("人力資源部"); 85 mid1->Add(leaf3); 86 mid1->Add(leaf4); 87 root->Add(mid1); 88 89 //分公司B 90 Company *mid2=new ConcreteCompany("分公司B"); 91 FinanceDepartment *leaf5=new FinanceDepartment("財務部"); 92 HRDepartment *leaf6=new HRDepartment("人力資源部"); 93 mid2->Add(leaf5); 94 mid2->Add(leaf6); 95 root->Add(mid2); 96 root->Show(0); 97 98 delete leaf1; delete leaf2; 99 delete leaf3; delete leaf4; 100 delete leaf5; delete leaf6; 101 delete mid1; delete mid2; 102 delete root; 103 system("pause"); 104 return 0; 105 }

C++設計模式之組合模式