output:
attacking with strength: 60
更牛逼的组合处理,
<?php
abstract class Unit {
function getComposite() {
return null;
}
abstract function bombardStrength();
}
abstract class CompositeUnit extends Unit { // 抽象类继承抽象类
private $units = array();
function getComposite() {
return $this;
}
protected function units() {
return $this->units;
}
function removeUnit( Unit $unit ) {
// >= php 5.3
//$this->units = array_udiff( $this->units, array( $unit ),
// function( $a, $b ) { 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 addUnit( Unit $unit ) {
if ( in_array( $unit, $this->units, true ) ) {
return;
}
$this->units[] = $unit;
}
}
class Army extends CompositeUnit {
function bombardStrength() {
$ret = 0;
foreach( $this->units as $unit ) {
$ret += $unit->bombardStrength();
}
return $ret;
}
}
class Archer extends Unit {
function bombardStrength() {
return 4;
}
}
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 );
?>
output:
Army Object
(
[units:CompositeUnit:private] => Array
(
[0] => Archer Object
(
)
[1] => Archer Object
(
)
[2] => Army Object
(
[units:CompositeUnit:private] => Array
(
[0] => Archer Object
(
)
[1] => Archer Object
(
)
[2] => LaserCannonUnit Object
(
)
)
)
)
)
点评:Unit 基础,CompositeUnit复合中实现add与remove。军队继承Composite,射手继承Archer。这样射手中就不会有多余的add与remove方法了。
装饰模式
装饰模式帮助我们改变具体组件的功能。
看例子
<?php
abstract class Tile { // 砖瓦
abstract function getWealthFactor(); // 获取财富
}
class Plains extends Tile { // 平原
private $wealthfactor = 2;
function getWealthFactor() {
return $this->wealthfactor;
}
}
class DiamondPlains extends Plains { // 钻石地段
function getWealthFactor() {
return parent::getWealthFactor() + 2;
}
}
class PollutedPlains extends Plains { // 污染地段
function getWealthFactor() {
return parent::getWealthFactor() - 4;
}
}
$tile = new PollutedPlains();
print $tile->getWealthFactor();
?>







