讓面向對象編程更加靈活的的模式-----組合模式

 umlphp

代碼實現數據庫

<?php
/*
combine.php
組合模式
*/

abstract class Unit{
    function getComposite(){
        return null;
    }
    abstract function bombardStrengrg();
}

abstract class CompositeUnit extends Unit{
    private $unit = array();

    function getComposite(){
        return $this;
    }

    protected function units(){
        return $this->units;
    }

    function removeUnit(Unit $unit){
        $this->unit = array_udiff($this->unit,array($unit),
            function($a,$b){return ($a===$b)?0:1;});
    }

    function addUnit(Unit $unit){
        if(in_array($unit,$this->unit,true)){
            return;
        }
        $this->unit[] = $unit;
    }
}

class Army extends CompositeUnit{
    function bombardStrengrg(){
        $ret = 0;
        foreach ($this->unit as $unit) {
            $ret+=$unit->bombardStrengrg();
        }
        return $ret;
    }
}


class UnitException extends Exception{}

class Archer extends Unit{
    function bombardStrengrg(){
        return 4;
    }
}

class LaserCanon extends Unit{
    function bombardStrengrg(){
        return 5;
    }
}

//client
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;
    }
}
?>

 

效果緩存

組合模式的簡化有時會下降對象類型的安全爲代價,模型變得越複雜,就不得不手動進行越多的類型檢查安全

組合模式的操做成本很大,解決辦法是在父級對象中緩存計算結果,使接下來的調用減小系統開銷this

在對象持久化上,雖然組合模式是一個優雅的模式,可是他並不能將自身輕鬆的存儲到關係型數據庫裏,適合於持久化爲xmlspa

 

小結code

由於組合模式是樹形結構,因此對總體的操做會影響到局部,而經過組合,對調用端來講局部的數據又是透明的,組合模式讓這些操做和查詢對調用端透明,對象數能夠方便進行遍歷,你也能夠輕鬆的在組合結構中加入新的組件類型,另外一方面,組合模式依賴於其組成部分的簡單性xml

相關文章
相關標籤/搜索