php 组合模式

 

/**
 * 组合模式
 * 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;
    }
}

 

 

posted on 2013-02-26 14:09  一天一點  阅读(152)  评论(0)    收藏  举报