} class LaserCannonUnit extends Unit { function bombardStrength() { return 44; } } class Army { private $units = array(); function addUnit(Unit $unit) { array_push($this->units, $unit); } function bombardStrength() { $ret = 0; foreach ($this->units as $unit) { $ret += $unit->bombardStrength(); } return $ret; } } $unit1 = new Archer(); $unit2 = new LaserCannonUnit(); $army = new Army(); $army->addUnit($unit1); $army->addUnit($unit2); print $army->bombardStrength();
function __construct(Tile $tile) { $this->tile = $tile; } } class DiamontDecorator extends TileDecorator { function getWealthFactor() { return $this->tile->getWealthFactor() + 5; } } class PollutionDecorator extends TileDecorator { function getWealthFactor() { return $this->tile->getWealthFactor() - 5; } } $tile = new Plains(); $pollution = new PollutionDecorator($tile); print $pollution->getWealthFactor() . "\n"; $army = new Army(); $army->addUnit(new Archer()); $army->addUnit(new LaserCanonUnit()); $sub_army = new Army(); $sub_army->addUnit(new Archer()); $sub_army->addUnit(new LaserCanonUnit()); $army->addUnit($sub_army); print "Атака всей армии составляет {$army->bombardStrength()}";
return $a === $b ? 0 : 1; }); // < php 5.3 // $this->units = array_udiff( $this->units, array( $unit ), // create_function( '$a,$b', 'return ($a === $b)?0:1;' ) ); } function bombardStrength() { $ret = 0; foreach ($this->units as $unit) { $ret += $unit->bombardStrength(); } return $ret; } } // create an army $main_army = new Army(); // add some units $main_army->addUnit(new Archer()); $main_army->addUnit(new LaserCannonUnit()); // create a new army $sub_army = new Army(); // add some units $sub_army->addUnit(new Archer()); $sub_army->addUnit(new Archer()); $sub_army->addUnit(new Archer()); // add the second army to the first $main_army->addUnit($sub_army); // all the calculations handled behind the scenes print "attacking with strength: {$main_army->bombardStrength()}\n";
<?php include_once '../../class/pattern/composite.php'; $archer = new Archer(); echo "archer attacking with strength: {$archer->bombardStrength()}" . "<br/>"; $main_army = new Army(); $main_army->addUnit($archer); $main_army->addUnit(new Archer()); $main_army->addUnit(new LaserCannonUnit()); echo "main_army attacking with strength: {$main_army->bombardStrength()}" . "<br/>"; $sub_army = new Army(); $sub_army->addUnit(new Archer()); $sub_army->addUnit(new Cavalry()); $sub_army->addUnit(new Cavalry()); echo "sub_army attacking with strength: {$sub_army->bombardStrength()}" . "<br/>"; $main_army->addUnit($sub_army); echo "main_army attacking with strength: {$main_army->bombardStrength()}" . "<br/>"; $troop = new TroopCarrier(); //$troop->addUnit(new Cavalry); $troop->addUnit(new Archer()); $troop->addUnit(new Archer()); //$troop->addUnit(new Cavalry()); echo "troop attacking with strength: {$troop->bombardStrength()}" . "<br/>"; $main_army->addUnit($troop); echo "attacking with strength: {$main_army->bombardStrength()}" . "<br/>"; ?>
if (in_array($unit, $this->units, true)) { return; } $this->units[] = $unit; } function removeUnit(Unit $unit) { $this->units = array_udiff($this->units, [$unit], function ($a, $b) { return $a === $b ? 0 : 1; }); } function bombardStrength() { $ret = 0; foreach ($this->units as $unit) { $ret += $unit->bombardStrength(); } return $ret; } } // создадим армию $main_army = new Army(); $main_army->addUnit(new Archer()); $main_army->addUnit(new LaserCannonUnit()); $sub_army = new Army(); $sub_army->addUnit(new Archer()); $sub_army->addUnit(new Archer()); $sub_army->addUnit(new Archer()); $main_army->addUnit($sub_army); print "Атакующая сила: {$main_army->bombardStrength()}\n";
$comp->addUnit($occupyingUnit); $comp->addUnit($newUnit); } return $comp; } } // класс Army - это композит (их тоже может быть много, как и листьев); // Они предназначены для того что бы содержать в себе объекты типа Unit. // Классы Archer и LaserCannon - это листья, предназначены для того что бы // поддерживать операции с объектами типа Unit, и в них не могут содержатся другие объекты типа Unit // создадим армию $main_army = new Army(); // добавим пару боевых едениц $main_army->addUnit(new Archer()); $main_army->addUnit(new LaserCannonUnit()); // создадим ещё армию $sub_army = new Army(); //добавим ей несколько боевых едениц $sub_army->addUnit(new Archer()); $sub_army->addUnit(new Archer()); $sub_army->addUnit(new Archer()); // добавим вторую армию к первой $main_army->addUnit($sub_army); // Все вычисления выполняются за кулисами print $main_army->bombardStrength(); echo "<hr>"; // Тут имитируем ситуацию когда $main_army был в клетке и в неё пришел ещё new Archer() // joinExisting() определил что $main_army это композит и добавил к нему new Archer() // и вернул ТОТ ЖЕ объект(не создавал новый) типа Army ($main_army) $new_army = UnitScript::joinExisting(new Archer(), $main_army); print $new_army->bombardStrength();
<?php use chapter10\DiamondDecorator; use chapter10\Plains; use chapter10\PollutionDecorator; $factory = new TerrainFactory(new EarthSea(-2), new EarthForest(), new EarthPlains()); print_r($factory->getSea()); print_r($factory->getForest()); print_r($factory->getPlains()); echo "<hr/>"; //TODO 216-217 page //main army $army = new Army(); $army->addUnit(new Archer())->addUnit(new LaserCannonUnit()); //sub army $sub_army = new Army(); $sub_army->addUnit(new TroopCarrier())->addUnit(new LaserCannonUnit())->addUnit(new LaserCannonUnit()); //merging two armies $army->addUnit($sub_army); echo "Attack power is equal to: " . $army->bombardStrength(); echo "<hr/>"; $tile = new DiamondDecorator(new PollutionDecorator(new Plains())); echo $tile->getWealthFactor(); echo "<hr/>"; $carrier = new TroopCarrier(); $carrier->addUnit(new Cavalry()); print_r(UnitScript::joinExisting($carrier, $army));
if (in_array($unit, $this->units, true)) { return; } $this->units[] = $unit; } function removeUnit(Unit $unit) { $this->units = array_udiff($this->units, [$unit], function ($a, $b) { return $a === $b ? 0 : 1; }); } function bombardStrength() { $ret = 0; foreach ($this->units as $unit) { $ret += $unit->bombardStrength(); } return $ret; } } $main_army = new Army(); $main_army->addUnit(new Archer()); $main_army->addUnit(new LaserCannonUnit()); $sub_army = new Army(); $sub_army->addUnit(new Archer()); $sub_army->addUnit(new Archer()); $sub_army->addUnit(new Archer()); $main_army->addUnit($sub_army); echo $main_army->bombardStrength(); var_dump($main_army); var_dump($sub_army);
{ public function bombardStrength() { return 44; } } class Cavalry extends Unit { public function bombardStrength() { return 15; } } $archer = new Archer(); echo "archer attacking with strength: " . $archer->bombardStrength() . "\n"; $main_army = new Army(); $main_army->addUnit($archer); $main_army->addUnit(new Archer()); $main_army->addUnit(new LaserCannonUnit()); $main_army->addUnit(new Cavalry()); echo "main_army attacking with strength: " . $main_army->bombardStrength() . "\n"; $sub_army = new Army(); $sub_army->addUnit(new Cavalry()); $sub_army->addUnit(new Cavalry()); $main_army->addUnit($sub_army); echo "main_army attacking with strength: " . $main_army->bombardStrength() . "\n"; $troop = new TroopCarrier(); $troop->addUnit(new Archer()); $troop->addUnit(new LaserCannonUnit()); $main_army->addUnit($troop); echo "main_army attacking with strength: " . $main_army->bombardStrength() . "\n";