C 設計模式11 組合模式 靠著大樹好乘涼

2021-09-20 21:07:03 字數 4089 閱讀 8835

(gof《設計模式》):將物件組合成樹形結構以表示「部分整體」的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。

① component 是組合中的物件宣告介面,在適當的情況下,實現所有類共有介面的預設行為。宣告乙個介面用於訪問和管理component子部件。

② leaf 在組合中表示葉子結點物件,葉子結點沒有子結點。

③ composite 定義有枝節點行為,用來儲存子部件,在component介面中實現與子部件有關操作,如增加(add)和刪除(remove)等。

以下情況下適用composite模式:

1.你想表示物件的部分-整體層次結構

2.你希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。

我們每天在公司上班,我們的公司其實就是乙個樹型結構的,最上邊是總公司,總公司下面還有很多子公司, 而每個子公司有很很多部門。這樣整個大公司就是一顆大樹,每個子公司同時也是一顆小叔

首先是公司的抽象介面

// 公司抽象類 

class

company    virtual ~company( )        virtual

void

add(company *pcompany)

// 增加子公司

virtual

void

show

(int depth)

= 0;               // 顯示部門

protected :    std::string m_name;                         // 顯示公司名字};

其次是公司的實現

// 公司類 

class

concretecompany :

public company    virtual ~concretecompany( );         // 虛析構函式

void

add(company *company)

// 新增子公司

void

show

(int depth)

// 顯示公司部門

std::cout

m_companylist.begin( );   it != this->m_companylist.end( );   ++it)   }protected :    std::list

m_companylist;          // 下屬公司列表};

接著是財務部門的實現

// 財務部門 

class

finacedepartment :

public company    virtual ~finacedepartment( )     void

show

(int depth)

// 顯示公司部門

std::cout

// 人力部門 

class

hrdepartment :

public company    virtual ~hrdepartment( );         // 虛析構函式

void

show

(int depth)

// 顯示公司部門

std::cout

int

main

()

組合模式解耦了客戶程式與複雜元素內部結構,從而使客戶程式可以像處理簡單元素一樣來處理複雜元素。

如果你想要建立層次結構,並可以在其中以相同的方式對待所有元素,那麼組合模式就是最理想的選擇。本章使用了乙個檔案系統的例子來舉例說明了組合模式的用途。在這個例子中,檔案和目錄都執行相同的介面,這是組合模式的關鍵。通過執行相同的介面,你就可以用相同的方式對待檔案和目錄,從而實現將檔案或者目錄儲存為目錄的子級元素。

(gof《設計模式》):將物件組合成樹形結構以表示「部分整體」的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。

① component 是組合中的物件宣告介面,在適當的情況下,實現所有類共有介面的預設行為。宣告乙個介面用於訪問和管理component子部件。

② leaf 在組合中表示葉子結點物件,葉子結點沒有子結點。

③ composite 定義有枝節點行為,用來儲存子部件,在component介面中實現與子部件有關操作,如增加(add)和刪除(remove)等。

以下情況下適用composite模式:

1.你想表示物件的部分-整體層次結構

2.你希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。

我們每天在公司上班,我們的公司其實就是乙個樹型結構的,最上邊是總公司,總公司下面還有很多子公司, 而每個子公司有很很多部門。這樣整個大公司就是一顆大樹,每個子公司同時也是一顆小叔

首先是公司的抽象介面

// 公司抽象類 

class

company    virtual ~company( )        virtual

void

add(company *pcompany)

// 增加子公司

virtual

void

show

(int depth)

= 0;               // 顯示部門

protected :    std::string m_name;                         // 顯示公司名字};

其次是公司的實現

// 公司類 

class

concretecompany :

public company    virtual ~concretecompany( );         // 虛析構函式

void

add(company *company)

// 新增子公司

void

show

(int depth)

// 顯示公司部門

std::cout

m_companylist.begin( );   it != this->m_companylist.end( );   ++it)   }protected :    std::list

m_companylist;          // 下屬公司列表};

接著是財務部門的實現

// 財務部門 

class

finacedepartment :

public company    virtual ~finacedepartment( )     void

show

(int depth)

// 顯示公司部門

std::cout

// 人力部門 

class

hrdepartment :

public company    virtual ~hrdepartment( );         // 虛析構函式

void

show

(int depth)

// 顯示公司部門

std::cout

int

main

()

組合模式解耦了客戶程式與複雜元素內部結構,從而使客戶程式可以像處理簡單元素一樣來處理複雜元素。

如果你想要建立層次結構,並可以在其中以相同的方式對待所有元素,那麼組合模式就是最理想的選擇。本章使用了乙個檔案系統的例子來舉例說明了組合模式的用途。在這個例子中,檔案和目錄都執行相同的介面,這是組合模式的關鍵。通過執行相同的介面,你就可以用相同的方式對待檔案和目錄,從而實現將檔案或者目錄儲存為目錄的子級元素。

設計模式11 組合模式

組合模式有時又叫部分 整體模式在處理類似樹形結構的問題時比較方便 分支類public class treenode public string getname public void setname string name public treenode getparent public void ...

設計模式11 組合模式

還是餐廳,多個餐廳合併,每個餐廳的選單實現方式不一樣,有的為arraylist有的為array.參見 10迭代器模式 增加餐後甜點子選單,需要改子選單和原選單列表中的選單項同級.原選單列表中都為menuitem,而現在還要增加子選單.要求如下 外鏈轉存失敗 img altdnffq 15661405...

C 設計模式(八)組合模式

在軟體開發過程中,我們經常會遇到處理簡單物件和復合物件的情況,例如對作業系統中目錄的處理就是這樣的乙個例子,因為目錄可以包括單獨的檔案,也可以包括資料夾,資料夾又是由檔案組成的,由於簡單物件和復合物件在功能上區別,導致在操作過程中必須區分簡單物件和復合物件,這樣就會導致客戶呼叫帶來不必要的麻煩,然而...