示例#1
0
}
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();
示例#2
0
    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()}";
示例#3
0
            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";
示例#4
0
<?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";
示例#6
0
文件: index.php 项目: Overfinch/oop
            $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();
示例#7
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));
示例#8
0
        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);
示例#9
0
{
    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";