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