组合模式又叫部分整体模式属于结构型模式,他把一组相似的对象当做一个单一的对象,从而提供了像管理一个对象一样去管理一组对象的方式,组合模式依靠树型结构的模式来组合管理对象,组合类的一个重要特点是局部类和组合类要具有相同的接口,这样在使用的时候要就可以无差别的使用他们。
php
abstract class Unit
{
abstract function addUnit(Unit $unit);
abstract function removeUnit(Unit $unit)
{
throw new UnitException(get_class($this).'is a leaf');
};
abstract function bombardStrength()
{
throw new UnitException(get_class($this).'is a leaf');
};
}
clsass Army extends Unit
{
private $units = [];
public function addUnit(Unit $unit)
{
if(in_array($unit,$this->units,true)){
return;
}
}
public function removeUnit(Unit $unit)
{
$this->units = array_udiff($this->units,array($unit),function($a,$b){
return ($a===$b)?0:1;
});
}
public function bombardStrength()
{
$ret = 0;
foreach($this->units as $unit){
$ret +=$unit->bombardStrength();
}
return $ret;
}
}
class UnitException extends Exception{}
class Archer extends Unit
{
public function bombardStrength()
{
return 4;
}
}
class LeaserCannonUnit extens Unit()
{
public function bombardStrength()
{
return 44;
}
}
//创建一个army对象
$main_army = new Army();
//添加一些Unit对象
$main_army ->addUnit(new Archer());
$main_army ->addUnit(new laserCannonUnit());
//创建一个新的army对象
$sub_army = new Army();
//添加一些Unit对象
$sub_army ->addUnit(new Archer());
$sub_army ->addUnit(new Archer());
$sub_army ->addUnit(new Archer());
//把第二个Army对象添加到第一二个Army对象中去
$main_army -> addUnit($sub_army);
//计算所有的攻击强度
var_dump($main_army->bombardStrength());