} //Создаем армию $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()); $sub_army2 = new Army(); $sub_army2->addUnit(new Sapper()); $sub_army3 = new TroopCarrier(); $sub_army3->addUnit(new Sapper()); $sub_army3->addUnit(new Sapper()); $sub_army3->addUnit(new Archer()); $sub_army2->addUnit(UnitScript::joinExisting(new Sapper(), new TroopCarrier())); //Собираем армии в одну $main_army->addUnit($sub_army); $main_army->addUnit($sub_army2); $main_army->addUnit($sub_army3); $textdump = new TextDumpArmyVisitor(); $main_army->accept($textdump); print $textdump->getText(); print "<br />"; $taxcollector = new TaxCollectionVisitor(); $main_army->accept($taxcollector); print $taxcollector->getReport() . "<br />"; print "Итого: "; print $taxcollector->getTax() . "<br />";
<?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));
$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();
class LaserCannonUnit extends Unit { function bombardStrength() { return 44; } } class UnitScript { static function joinExisting(Unit $newUnit, Unit $occupyingUnit) { $comp; if (!is_null($comp = $occupyingUnit->getComposite())) { $comp->addUnit($newUnit); } else { $comp = new Army(); $comp->addUnit($occupyingUnit); $comp->addUnit($newUnit); } return $comp; } } $army1 = new Army(); $army1->addUnit(new Archer()); $army1->addUnit(new Archer()); $army2 = new Army(); $army2->addUnit(new Archer()); $army2->addUnit(new Archer()); $army2->addUnit(new LaserCannonUnit()); $composite = UnitScript::joinExisting($army2, $army1); print_r($composite);