組合模式屬於結構型模式
概述:將對象組合成樹形結構以表示‘部分-整體’的階層。組合模式使得使用者對單個對象和組合對象的使用具有一致性。
組合和彙總都描述一個類長期持有其他類的一個或多個執行個體的情況。
彙總:被包含對象是容器的核心部分,但是他們也可以被其他對象所包含。彙總關係用一條以空心菱形開頭的線來說明。
組合:被包含的對象只能被它的容器所引用。當容器被刪除時,它也應該被刪除。組合關係的菱形是實心的
/**
* 執行單元
*/
abstract class Unit{
public function bombardStrength();
}
/**
* 弓箭手
*/
class ArcherUnit extends Unit{
public function bombardStrength(){
return 4;
}
}
/**
* 雷射大炮
*/
class LaserCannonUnit extends Unit{
public function bombardStrength(){
return 10;
}
}
/**
* 軍隊
*/
class Arm{
private $units = array();
private $strength = 0;
public function addUnit(Unit $unit){
array_push($this->units, $unit);
}
public function bombardStrength(){
foreach ($this->units as $unit){
$this->strength += $unit->bombardStrength();
}
}
}
/**
* 組合模式
*/
public function actionCombine(){
$archer = new ArcherUnit;
$laserCannon = new LaserCannonUnit;
$arm = new Arm;
$arm->addUnit($archer);
$arm->addUnit($laserCannon);
echo $arm->bombardStrength();
}