組合模式:允許客戶將對象組合成樹形結(jié)構(gòu)來表現(xiàn) 整體/部分”層次結(jié)構(gòu)。組合能讓客戶以一致的方式處理個(gè)別對象以及對象組合。
組合模式讓我們能用樹形方式創(chuàng)建對象的結(jié)構(gòu),樹里面包含了組合以及個(gè)別的對象。使用組合結(jié)構(gòu),我們能把相同的操作應(yīng)用在組合和個(gè)別對象上。換句話說,在大多數(shù)情況下,我們可以忽略對象組合和個(gè)別對象之間的差別。
包含其他組件的組件為組合對象;不包含其他組件的組件為葉節(jié)點(diǎn)對象。
組合模式為了保持”透明性“,常常會(huì)違反單一責(zé)任原則。也就是說,它一方面要管理內(nèi)部對象,另一方面要提供一套訪問接口。
當(dāng)組合模式接口里提供刪除子節(jié)點(diǎn)的方法時(shí),在組件里有一個(gè)指向父節(jié)點(diǎn)的指針的話,實(shí)現(xiàn)刪除操作會(huì)比較容易。
以一個(gè)軍隊(duì)的戰(zhàn)斗力計(jì)算為例演示組合模式
軍隊(duì)由步兵、炮兵、特種兵組成,他們都具備一個(gè)能力就是戰(zhàn)斗并具備各自的戰(zhàn)斗力。我們通過他們組合成一個(gè)軍隊(duì)并完成戰(zhàn)斗力的計(jì)算。
?php//抽象士兵類interface soldier{html' target='_blank'>public function fire();//步兵 攻擊力5class bubing implements soldier{public function fire(){return 5;//炮兵 攻擊力8class paobing implements soldier{public function fire(){return 8;//特種兵 攻擊力 12class tezhongbing implements soldier{public function fire(){return 12;//軍隊(duì)類實(shí)現(xiàn)兵種的組合class arm{//存儲作戰(zhàn)兵種的數(shù)組 private $soldier = array();//添加作戰(zhàn)兵種public function add($soldierType){//獲取對應(yīng)的兵種對象$soldier = new $soldierType();//保存進(jìn)數(shù)組利用數(shù)組的鍵記錄兵種 便于刪除$this- soldier[$soldierType] = $soldier;//刪除兵種public function delete($soldierType){if(isset($this- soldier[$soldierType])){unset($this- soldier[$soldierType]);//計(jì)算并輸出戰(zhàn)斗能力public function show(){$zhantouli = 0;foreach($this- soldier as $v){$zhantouli += $v- fire();echo 軍隊(duì)的戰(zhàn)斗力: .$zhantouli;$arm = new arm();$arm- add( bubing $arm- add( paobing $arm- show();$arm- delete( paobing $arm- show();
以上就是什么是組合模式?(舉例說明)的詳細(xì)內(nèi)容,PHP教程
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選