/**
* 组合模式
* Composite
意图:
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite 使得用户对单个对象和组合对象的使用具有一致性。
适用性:
你想表示对象的部分-整体层次结构。
你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
*/
abstract class Unit{
abstract function addUnit(Unit $unit);
abstract function removeUnit(Unit $unit);
abstract function bombardStrength();
}
class Archer extends Unit{
function bombardStrength()
{
return 2;
}
function addUnit(Unit $unit){
UnitException::getInstance('can not use '. get_class($this).' addUnit');
}
function removeUnit(Unit $unit){
UnitException::getInstance('can not use '. get_class($this).' addUnit');
}
}
class LaserCanon extends Unit{
function bombardStrength()
{
return 10;
}
function addUnit(Unit $unit){
UnitException::getInstance('can not use '. get_class($this).' addUnit');
}
function removeUnit(Unit $unit){
UnitException::getInstance('can not use '. get_class($this).' addUnit');
}
}
class UnitException{
private static $instance;
private function __construct($message, $code, $previous)
{
throw new Exception('$message', 2);
}
public function getInstance($message, $code=500, $previous=''){
if(!self::$instance){
self::$instance = new UnitException($message, $code, $previous);
}
}
}
class Army extends Unit{
private $units = array();
public function addUnit(Unit $unit)
{
if(in_array($this->units, $unit)){
return false;
}
$this->units[] = $unit;
}
public function removeUnit(Unit $unit)
{
foreach ($this->units as &$this_unit){
if($unit === $this_unit ){
unset($this_unit);
return true;
}
}
return false;
}
public function bombardStrength()
{
$ret = 0;
foreach ($this->units as &$unit){
$ret+=$unit->bombarStrength();
}
return $ret;
}
}
![]()