//组合模式 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();
php 设计模式(组合模式一)
最新推荐文章于 2021-07-13 07:58:07 发布