概述:将工具组合成树形构造以表示‘部分-整体’的层次构造。组合模式使得用户对单个工具和组合工具的利用具有同等性。
组合和聚合都描述一个类长期持有其他类的一个或多个实例的情形。
聚合:被包含工具是容器的核心部分,但是他们也可以被其他工具所包含。聚合关系用一条以空心菱形开头的线来解释。

组合:被包含的工具只能被它的容器所引用。当容器被删除时,它也该当被删除。组合关系的菱形是实心的
<?php
/
实行单元
/
abstract class Unit{
public function bombardStrength();
}
<?php
/
弓箭手
/
class ArcherUnit extends Unit{
public function bombardStrength(){
return 4;
}
}
<?php
/
激光大炮
/
class LaserCannonUnit extends Unit{
public function bombardStrength(){
return 10;
}
}
<?php
/
军队
/
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();
}
}
}
<?php
/
组合模式
/
public function actionCombine(){
$archer = new ArcherUnit;
$laserCannon = new LaserCannonUnit;
$arm = new Arm;
$arm->addUnit($archer);
$arm->addUnit($laserCannon);
echo $arm->bombardStrength();
}