組合模式:允許客戶將對象組合成樹形結構來表現 整體/部分”層次結構。組合能讓客戶以一致的方式處理個別對象以及對象組合。
組合模式讓我們能用樹形方式創建對象的結構,樹里面包含了組合以及個別的對象。使用組合結構,我們能把相同的操作應用在組合和個別對象上。換句話說,在大多數情況下,我們可以忽略對象組合和個別對象之間的差別。
包含其他組件的組件為組合對象;不包含其他組件的組件為葉節點對象。
組合模式為了保持”透明性“,常常會違反單一責任原則。也就是說,它一方面要管理內部對象,另一方面要提供一套訪問接口。
當組合模式接口里提供刪除子節點的方法時,在組件里有一個指向父節點的指針的話,實現刪除操作會比較容易。
以一個軍隊的戰斗力計算為例演示組合模式
軍隊由步兵、炮兵、特種兵組成,他們都具備一個能力就是戰斗并具備各自的戰斗力。我們通過他們組合成一個軍隊并完成戰斗力的計算。
?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;//軍隊類實現兵種的組合class arm{//存儲作戰兵種的數組 private $soldier = array();//添加作戰兵種public function add($soldierType){//獲取對應的兵種對象$soldier = new $soldierType();//保存進數組利用數組的鍵記錄兵種 便于刪除$this- soldier[$soldierType] = $soldier;//刪除兵種public function delete($soldierType){if(isset($this- soldier[$soldierType])){unset($this- soldier[$soldierType]);//計算并輸出戰斗能力public function show(){$zhantouli = 0;foreach($this- soldier as $v){$zhantouli += $v- fire();echo 軍隊的戰斗力: .$zhantouli;$arm = new arm();$arm- add( bubing $arm- add( paobing $arm- show();$arm- delete( paobing $arm- show();
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答