//组合模式
abstract class Unit{
abstract function addUnit(Unit $unit);
abstract function removeUnit(Unit $unit);
abstract function bombardStrength();
}
class Army extends Unit{
public $unit = [];
public function addUnit(Unit $unit){
if(in_array($unit, $this->unit,true)){
return;
}
$this->unit[] = $unit;
}
public function removeUnit(Unit $unit){
$this->unit = array_udiff($this->unit, [$unit], function($a,$b){
if ($a===$b)
{
return 0;
}
return ($a>$b)?1:-1;
});
}
public function bombardStrength()
{
$ret = 0;
foreach($this->unit as $unit){
$ret += $unit->bombardStrength();
}
return $ret;
}
}
//缺点所有子类都必须实现抽象的add和remove方法,我们仅仅需要组合类拥有add和remove方法
class Archer extends Unit{
public function addUnit(Unit $unit)
{
// TODO: Implement addUnit() method.
}
public function removeUnit(Unit $unit)
{
// TODO: Implement removeUnit() method.
}
public function bombardStrength()
{
return 4;
}
}
class Brcher extends Unit{
public function addUnit(Unit $unit)
{
// TODO: Implement addUnit() method.
}
public function removeUnit(Unit $unit)
{
// TODO: Implement removeUnit() method.
}
public function bombardStrength()
{
return 2;
}
}
$ar = new Army();
$a = new Archer();
$b = new Brcher();
$ar->addUnit($a);
$ar->addUnit($b);
print_r($ar->unit);
$ar->removeUnit($b);
print_r($ar->unit);
echo $ar->bombardStrength();