标签:
<?php abstract class Unit { abstract public function add_unit(Unit $unit); abstract public function remove_unit(Unit $unit); abstract public function bomboard_strength(); } class Army extends Unit { private $units = array(); public function add_unit(Unit $unit) { if (in_array($unit, $this->units, true)) { return ; } $this->units[] = $unit; } public function remove_unit(Unit $unit) { $this->units = array_diff($this->units, array($unit), function ($a, $b){return ($a === $b) ? 0 : 1;}); } public function bomboard_strength() { $ret = 0; foreach ($this->units as $unit) { $ret += $unit->bomboard_strength(); } return $ret; } } class UnitException extends Exception {} class Archer extends Unit { function add_unit(Unit $unit) { throw new UnitException(get_class($this). " is a leaf."); } function remove_unit(Unit $unit) { throw new UnitException(get_class($this). " is a leaf."); } function bomboard_strength() { return 4; } } class LaserCannononUnit extends Unit { function add_unit(Unit $unit) { throw new UnitException(get_class($this). " is a leaf."); } function remove_unit(Unit $unit) { throw new UnitException(get_class($this). " is a leaf."); } function bomboard_strength() { return 44; } } //CLIENT CODE $main_army = new Army(); $main_army->add_unit(new Archer()); $main_army->add_unit(new LaserCannononUnit()); $sub_army = new Army(); $sub_army->add_unit(new Archer()); $sub_army->add_unit(new Archer()); $sub_army->add_unit(new Archer()); $main_army->add_unit($sub_army); print "attacking with strength: {$main_army->bomboard_strength()}";
上面是简单版本,下面还有改进版!!!
标签:
原文地址:http://www.cnblogs.com/wy0314/p/4781829.html