C++設計模式實現--組合(Composite)模式

來源:互聯網
上載者:User

標籤:style   http   color   使用   os   io   strong   for   

一. 舉例

這個範例是書上的,如果有一個公司的組結結構例如以下:


它的結構非常像一棵樹,當中人力資源部和財務部是沒有子結點的,詳細公司才有子結點。

並且最關健的是,它的每一層結構非常相似。

代碼實現例如以下:
#include <iostream>
#include <list>
#include <string>
using namespace std;


//公司類,提供介面  
class Company      
{    
public:    
Company(string name)  
{  
m_name = name;  
}    


virtual ~Company()  
{}    


virtual void Add(Company *pCom)  
{}    


virtual void Display(int depth)  
{}  


protected:  
string m_name;    
};  


//詳細公司  
class ConcreteCompany : public Company      
{    
public:    
ConcreteCompany(string name): Company(name)  
{}  


virtual ~ConcreteCompany()  
{}  


//添加?子樹或葉子  
void Add(Company *pCom)  
{  
m_listCompany.push_back(pCom);  
}  


//顯示  
void Display(int depth)  
{  
for(int i = 0;i < depth; i++)  
{  
cout<<"-";    


}  


cout<< m_name << endl;  


list<Company *>::iterator iter = m_listCompany.begin();    


for(; iter != m_listCompany.end(); iter++) //顯示下層結點    
{      
(*iter)->Display(depth + 2);  
}  
}  


private:    
list<Company *> m_listCompany;    
};    


//詳細的部門,財務部    
class FinanceDepartment : public Company     
{  
public:    
FinanceDepartment(string name):Company(name)  
{}    


virtual ~FinanceDepartment()  
{}    


//僅僅需顯示,無限加入?函數,由於已是葉結點    
virtual void Display(int depth)  
{    
for(int i = 0; i < depth; i++)    
cout<<"-";    


cout<< m_name << endl;  
}  
};    


//詳細的部門,人力資源部    
class HRDepartment :public Company      
{    
public:    
HRDepartment(string name):Company(name)  
{}  


virtual ~HRDepartment()  
{}  


//僅僅需顯示,無限加入?函數,由於已是葉結點    
virtual void Display(int depth)  
{  
for(int i = 0; i < depth; i++)    
{  
cout<<"-";  
}  
cout<< m_name << endl;    
}    
};  


//////////////////////////////////////////////////////////////////////////  
//測試代碼  
int main()  
{  
Company *root = new ConcreteCompany("總公司");    
Company *leaf1=new FinanceDepartment("財務部");    
Company *leaf2=new HRDepartment("人力資源部");    
root->Add(leaf1);    
root->Add(leaf2);    


//華東分公司  
Company *mid1 = new ConcreteCompany("華東分公司");    
Company *leaf3=new FinanceDepartment("華東分公司財務部");    
Company *leaf4=new HRDepartment("華東分公司人力資源部");    
mid1->Add(leaf3);  
mid1->Add(leaf4);  
root->Add(mid1);  


//南京辦事處  
Company *mid2=new ConcreteCompany("南京辦事處");    
FinanceDepartment *leaf5=new FinanceDepartment("南京辦事處財務部");    
HRDepartment *leaf6=new HRDepartment("南京辦事處人力資源部");    
mid2->Add(leaf5);  
mid2->Add(leaf6);  
root->Add(mid2);  


//杭州辦事處  
Company *mid3=new ConcreteCompany("杭州辦事處");    
FinanceDepartment *leaf7=new FinanceDepartment("杭州辦事處財務部");    
HRDepartment *leaf8=new HRDepartment("杭州辦事處人力資源部");    
mid3->Add(leaf7);    
mid3->Add(leaf8);    
mid2->Add(mid3);  


root->Display(0);  


delete leaf1;  
delete leaf2;    
delete leaf3;  
delete leaf4;    
delete leaf5;  
delete leaf6;  
delete leaf7;  
delete leaf8;    
delete mid1;  
delete mid2;    
delete root;    
getchar();
return 0;  
}  

二. 說明

1. 上面公司的結構圖事實上就是總體與部分的關係,並且的話總體與部分能夠一致對待,由於有非常多相似之處嘛。

2. 這棵樹有兩種幾能,要麼是棵葉,要麼是子棵。

事實上這樣的模式就是組合模式。

三. 組合模式

定義:將對象組合成樹形結構以表示“部分-總體”的階層。組合使得使用者對單個對象和組合對象的使用具有一致性

要注意兩點:

1. “樹形”,必須是一種階層,有能夠向下延伸的分枝,也有不變的樹葉。

2. "一致性",也就是要具有非常多相似性。

結構圖例如以下:

component:主要是定義統一的介面,說白了也就是提取出相似性。

composite:定義分枝節點,也就是子樹。

leaf:定義分葉節點,分葉節點是沒有子節點的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.