首頁  >  文章  >  後端開發  >  什麼是組合模式? (舉例說明)

什麼是組合模式? (舉例說明)

藏色散人
藏色散人轉載
2019-04-16 09:55:464893瀏覽

組合模式(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(&#39;bubing&#39;);
$arm->add(&#39;paobing&#39;);
$arm->show();
$arm->delete(&#39;paobing&#39;);
$arm->show();

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

陳述:
本文轉載於:hcoder.net。如有侵權,請聯絡admin@php.cn刪除