//组合模式
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();
转载请注明原文地址: https://www.6miu.com/read-11597.html