GOF 八 組合模式 推薦

2021-09-26 14:09:04 字數 4388 閱讀 9544

組合模式(又叫部分整體模式):根據樹形結構來組合物件,用來表示部分及整體的層次,所以是結構型

組合模式讓單個物件組合物件的使用具有一致性,使用者不需要關心自己處理的是單個物件還是整個組合結構,而且不用因為加入新的物件而修改**。

uml的相關知識,可以訪問我的另外一篇博文

透明式

由於component被聚合,所以我習慣先編寫此類

【名稱與uml圖名稱一致,不多解釋】

public

abstract

class

component

編寫component的兩個實現類

composite【相當於樹幹】(樹幹可以有葉子、也可以有其他 「子」樹幹 )

/**

* @description:

* 樹幹,可以有葉子,或者其他更小的 子樹幹

*/public

class

composite

extends

component

public

composite

(string name,

int price)

public string getname()

public

intgetprice()

public

void

setprice

(int price)

public

void

setname

(string name)

@override

public

inttotalprice()

return num;

}// 新增子節點,其實就是向list中加入component型別的值

@override

public

void

add(component component)

// 刪除子節點,其實就是向list中移除component型別的值

@override

public

void

remove

(component component)

}

leaf【相當於葉子】

/**

* @description:

* 葉子節點,無法進行新增和刪除操作

* 透明式的組合模式:葉子節點中的新增和刪除操作用不到,但是必須要有

*/public

class

leaf

extends

component

public string getname()

public

void

setname

(string name)

public

intgetprice()

public

void

setprice

(int price)

@override

public

inttotalprice()

@override

public

void

add(component component)

catch

(exception e)

}@override

public

void

remove

(component component)

catch

(exception e)

}}

由此可以看出,之所以可以add和remove,主要是composite【樹幹】聚合了component【即:list】,對list進行操作(這裡只是舉例為list,實際使用時,可以根據情況修改為其他資料型別)

**實現組合的樹形結構:

root

|___computercase(機箱)【樹幹】

| |

| |____mainboard(主機板)【葉子】

| |____cpu【葉子】

| |____gpu(顯示卡)【葉子】

| |___keyboard(鍵盤)【葉子】

| |___screen(顯示屏)【葉子】

測試**:

// 透明式的組合模式:new 的時候不需要區分是葉子還是樹幹

public

static

void

main

(string[

] args)

測試結果:

5300
安全式**如下:

component

public

abstract

class

component

;public

void

remove

(component component)

;}

composite【樹幹】:和透明式相比沒有什麼變化

/**

* @description:

* 樹幹,可以有葉子,或者其他更小的 子樹幹

*/public

class

composite

extends

component

public

composite

(string name,

int price)

public string getname()

public

intgetprice()

public

void

setprice

(int price)

public

void

setname

(string name)

@override

public

inttotalprice()

return num;

}// 新增子節點,其實就是向list中加入component型別的值

@override

public

void

add(component component)

// 刪除子節點,其實就是向list中移除component型別的值

@override

public

void

remove

(component component)

}

leaf:這裡我選擇了刪除它的add和remove方法

/**

* @description:

* 葉子節點,無法進行新增和刪除操作

* 安全式的組合模式:葉子節點中的新增和刪除操作用不到,我選擇了刪除

*/public

class

leaf

extends

component

public string getname()

public

void

setname

(string name)

public

intgetprice()

public

void

setprice

(int price)

@override

public

inttotalprice()

}

測試**:

// 安全式的組合模式:需要指明是葉子還是樹幹

public

static

void

main

(string[

] args)

測試結果:

5300
總結:

**已經上傳到git:訪問

設計模式之GOF23組合模式

組合模式composite 使用組合模式的場景 把部分和整體的關係用樹形結構表示,從而使客戶端可以使用統一的方式處理物件和整體物件 檔案和資料夾 組合模式核心 抽象構件 component 角色 定義了葉子和容器的共同點 葉子 leaf 構件角色 無子節點 容器 composite 構件角色 有容器...

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

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

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

組合模式,是為了解決整體和部分一直對待的問題而產生的,要求整體和部分有很多一致的操作。部分和整體繼承同乙個抽象幾口,這樣,外部使用時是一致的,同乙個方法能遍歷整體也能訪問部分。g o composite main.cpp composite.cpp結果 operation from leaf ope...