組合模式 設計模式 組合模式

2021-10-14 17:13:07 字數 2954 閱讀 9857

1.需求分析

假設要給乙個大公司做辦公管理系統,公司有人力資源部、財務部等,然後公司在其他城市還有分公司,分公司也有自己的人力資源部、財務部等,要求總公司、分公司以及各部分成樹狀結構管理。要完成這麼乙個系統,為了有乙個更好的設計,方便開發的展開,就需要了解乙個設計模式——組合模式。

2.定義:

將物件組合成樹形結構以表示『部分-整體』的層次結構,使得使用者對單個物件和組合物件的使用具有一致性。

3.角色

3.1 component(抽象構件):抽象類或者介面,定義共有的行為和屬性,用於訪問和管理component的子部件。

3.2 composite(樹枝節點):定義樹枝節點的行為,實現與子部件有關的操作,比如增加add和刪除remove等,其中會儲存自己的子部件。

3.3 leaf(葉子節點):定義樹葉節點的行為,葉節點沒有子節點。

4.實戰示例

4.1 抽象構件

/**

* 組合模式-抽象類或介面(抽象公司)

*/public abstract class company

//新增

public abstract void add(company c);

//刪除

public abstract void remove(company c);

//展示

public abstract void show(int level);

}

4.2 樹枝節點(具體公司)

/**

* 組合模式-樹枝節點(具體公司)

*/public class concretecompany extends company

@override

public void add(company c)

@override

public void remove(company c)

@override

public void show(int level)

}

4.3 樹葉節點(人力資源部)

/**

* 組合模式-樹葉節點(人力資源部)

*/public class hrdepartment extends company

@override

public void add(company c)

@override

public void remove(company c)

@override

public void show(int level)

}

4.4 樹頁節點(財務部)

/**

* 組合模式-樹頁節點(財務部)

*/public class financedepartment extends company

@override

public void add(company c)

@override

public void remove(company c)

@override

public void show(int level)

}

4.5 客戶端

/**

* 客戶端(組裝公司)

*/public class client

}

4.6 列印結果

公司結構圖:

-成都總公司

--總公司人力資源部

--總公司財務部

--武漢分公司

---武漢分公司人力資源部

---武漢分公司財務部

--上海分公司

---上海分公司人力資源部

---上海分公司財務部

5.實現方式5.1透明方式(樹枝節點和樹葉節點看作相同的節點):在抽象構件中宣告了所有用來管理子物件的方法,比如add、remove方法等。這樣確保了實現介面的所有子類都具備完全一致的行為介面,包括add和remove等方法。這樣做的好處就是葉節點和枝節點對於外界沒有區別。但問題也很明顯,葉子節點不可能有下乙個層次的物件,所以給葉子節點提供add()、remove()等方法是沒有任何意義的。

5.2安全方式(樹枝節點和樹葉節點看作不同的節點):在抽象構件中沒有宣告用來管理子物件的方法,比如add、remove方法,那麼子類的葉子類也就不需要去實現它們,而是在樹枝類composite中宣告所有用來管理子類物件的方法。但由於不夠透明,所有葉子類和樹枝類將具有不同的方法,客戶端不能針對抽象程式設計,呼叫需要做相應的判斷,會帶來不便。

注:兩種實現方式各有好處,視情況而定。

6.優點

組合模式讓客戶可以一致地使用組合結構和單個物件。組合模式的關鍵是定義了乙個抽象構件類,它既可以代表單個物件,又可以代表組合結構。基本物件可以被組合成更複雜的組合物件,而這個組合物件又可以被組合,這樣不斷地遞迴下去。客戶端針對該抽象構件類進行程式設計,無須知道它到底表示的是單個物件還是組合物件,可以對其進行統一處理。

7.使用場景

需求中是體現部分與整體層次結構時,如果希望使用者可以忽略組合物件與單個物件的不同,統一的使用組合結構中的所有物件時,就可以使用組合模式。

8.解決的問題

在涉及到部分與整體的複雜層次關係時,如果區別地對待單個物件和組合物件,會導致組裝處理這種結構非常麻煩(程式中的表現是有很多複雜的判斷),如果使用組合模式,就可以使客戶程式與複雜元素的內部結構解耦,使整體與部分可以被一致對待,客戶端就可以很方便的使用一致的行為介面來組裝處理這種層次關係。

設計模式 組合模式 組合模式使用

目錄 組合模式概括 組合模式使用場景 定義 將物件組合成樹形結構以表示 部分 整體 的層次結構 作用 使客戶端對單個物件和組合物件保持一致的處理方式 使用場景 1.希望客戶端可以忽略組合物件與單個物件的差異時 2.處理乙個樹形結構時 優點 清楚的定義分層次的複雜物件,表示物件的全部或部分層次 讓客戶...

設計模式 組合模式

定義 將物件組合成樹形結構以表示 部分 整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。範例一 using system using system.collections.generic using system.text namespace 組合模式 範例二 公司管理系統...

設計模式 組合模式

1 menucomponent.h ifndef menucomponent h define menucomponent h include class menucomponent 組合物件基類component 建構函式 menucomponent std string strname m st...