PHP设计模式之组合模式

来源:互联网 发布:控制仿真类软件 编辑:程序博客网 时间:2024/06/03 21:19

本文知识来源于:《深入PHP面向对象、模式和实践》一书

参考资料:设计模式(七)组合模式Composite(结构型)

典型的组合模式结构图:


例子:

       例如一个军队,军队可以添加士兵,添加其他军队。军队可以计算自己的总战斗力,每个士兵也有自己的战斗力,那么这可以实现一个同名的方法,军队和士兵各自重写这个方法的具体实现,这样在统计的过程中,直接调用该方法,就可以计算总战斗力。


代码如下:

<?php/*Title:组合模式Detail:军队与士兵的组合模型class:Army,军队;Archer,士兵;Unit,基本单元*///异常class UnitException extends Exception{}//基本单元abstract class Unit{//攻击力总和abstract function bombardStrength();//添加单元function addUnit(Unit $unit){throw new UnitException(get_class($this)."is a leaf");}//移除单元function removeUnit(Unit $unit){throw new UnitException(get_class($this)."is a leaf");}} //士兵类class Archer extends Unit{function bombardStrength(){return 4;}}//军队类class Army extends Unit{private $units=array();function addUnit(Unit $unit){if(in_array($unit,$this->units,true)){return;}$this->units[]=$unit;}function removeUnit(Unit $unit){$this->units=array_diff($this->units,array($unit),function($a,$b){return ($a===$b)?0:1;});}function bombardStrength(){$ret=0;foreach ($this->units as $k => $v) {$ret+=$v->bombardStrength();}return $ret;}}$main_army=new Army();$main_army->addUnit(new Archer());$main_army->addUnit(new Archer());$sub_army=new Army();$sub_army->addUnit(new Archer());$sub_army->addUnit(new Archer());$sub_army->addUnit(new Archer());$main_army->addUnit($sub_army);print_r($main_army);/*输出:Army Object(    [units:Army:private] => Array        (            [0] => Archer Object                (                )            [1] => Archer Object                (                )            [2] => Army Object                (                    [units:Army:private] => Array                        (                            [0] => Archer Object                                (                                )                            [1] => Archer Object                                (                                )                            [2] => Archer Object                                (                                )                        )                )        ))*/echo '<br />';echo $main_army->bombardStrength();//输出:20




0 0
原创粉丝点击