組合模式(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();
以上是什麼是組合模式? (舉例說明)的詳細內容。更多資訊請關注PHP中文網其他相關文章!