Exemplo n.º 1
0
}
//Создаем армию
$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 />";
Exemplo n.º 2
0
<?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));
Exemplo n.º 3
0
            $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();
Exemplo n.º 4
0
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);