組合模式(又叫部分整體模式):根據樹形結構
來組合物件,用來表示部分及整體的層次,所以是結構型
組合模式讓單個物件
和組合物件
的使用具有一致性
,使用者不需要關心自己處理的是單個物件還是整個組合結構,而且不用因為加入新的物件而修改**。
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...