組合模式 (Composite Pattern)
組合模式:允許客戶將對象組合成樹形結構來表現"整體/部分”層次結構。組合能讓客戶以一致的方式處理個別對象以及對象組合。
組合模式讓我們能用樹形方式創建對象的結構,樹里面包含了組合以及個別的對象。使用組合結構,我們能把相同的操作應用在組合和個別對象上。換句話說,在大多數情況下,我們可以忽略對象組合和個別對象之間的差別。
包含其他組件的組件為組合對象;不包含其他組件的組件為葉節點對象。
組合模式為了保持”透明性“,常常會違反單一責任原則。也就是說,它一方面要管理內部對象,另一方面要提供一套訪問接口。
當組合模式接口里提供刪除子節點的方法時,在組件里有一個指向父節點的指針的話,實現刪除操作會比較容易。
以一個軍隊的戰斗力計算為例演示組合模式
軍隊由步兵、炮兵、特種兵組成,他們都具備一個能力就是戰斗并具備各自的戰斗力。我們通過他們組合成一個軍隊并完成戰斗力的計算。
- <?php
- //抽象士兵類
- interface soldier{
- public function fire();
- }
- //步兵 攻擊力5
- class bubing implements soldier{
- public function fire(){
- return 5;
- }
- }
- //炮兵 攻擊力8
- class paobing implements soldier{
- public function fire(){
- return 8;
- }
- }
- //特種兵 攻擊力 12
- class 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();
新聞熱點
疑難解答