本文实例讲述了PHP面向对象程序设计组合模式与装饰模式。分享给大家供大家参考,具体如下:
组合模式
定义:组合模式定义了一个单根继承体系,使具有截然不同职责的集合可以并肩工作。
一个军队的案例,
<?phpabstract class Unit { // 个体 abstract function bombardStrength();}class Archer extends Unit { // 弓箭手 function bombardStrength() { return 4; }}class LaserCannonUnit extends Unit { // 火炮手 function bombardStrength() { return 44; }}?>
军队整合成员,输出火力
<?phpabstract class Unit { abstract function bombardStrength();}class Archer extends Unit { function bombardStrength() { return 4; }}class LaserCannonUnit extends Unit { function bombardStrength() { return 44; }}class Army { // 军队 private $units = array(); // 定义私有属性 个体集 function addUnit( Unit $unit ) { // 添加成员 array_push( $this->units, $unit ); } function bombardStrength() { // 火力 $ret = 0; foreach( $this->units as $unit ) { $ret += $unit->bombardStrength(); } return $ret; }}$unit1 = new Archer();$unit2 = new LaserCannonUnit();$army = new Army();$army->addUnit( $unit1 );$army->addUnit( $unit2 );print $army->bombardStrength(); // 输出火力?>
output:
48
军队进一步整合其他军队
<?phpabstract class Unit { abstract function bombardStrength();}class Archer extends Unit { function bombardStrength() { return 4; }}class LaserCannonUnit extends Unit { function bombardStrength() { return 44; }}class Army { private $units = array(); private $armies= array(); function addUnit( Unit $unit ) { array_push( $this->units, $unit ); } function addArmy( Army $army ) { array_push( $this->armies, $army ); } function bombardStrength() { $ret = 0; foreach( $this->units as $unit ) { $ret += $unit->bombardStrength(); } foreach( $this->armies as $army ) { $ret += $army->bombardStrength(); } return $ret; }}$unit1 = new Archer();$unit2 = new LaserCannonUnit();$army = new Army();$army->addUnit( $unit1 );$army->addUnit( $unit2 );print $army->bombardStrength();print "/n";$army2 = clone $army; // 克隆军队$army->addArmy( $army2 );print $army->bombardStrength();print "/n";?>
output:
48
96
更好的方式,支持新增,移除等等其他功能。
<?phpabstract class Unit { abstract function addUnit( Unit $unit ); abstract function removeUnit( Unit $unit ); abstract function bombardStrength();}class Army extends Unit { // 军队 private $units = array(); function addUnit( Unit $unit ) { if ( in_array( $unit, $this->units, true ) ) { // $this用于调用正常的属性或方法,self调用静态的方法,属性或者常量 return; } $this->units[] = $unit; } function removeUnit( Unit $unit ) { // >= php 5.3 $this->units = array_udiff( $this->units, array( $unit ), function( $a, $b ) { return ($a === $b)?0:1; } ); // < php 5.3 // $this->units = array_udiff( $this->units, array( $unit ), // create_function( '$a,$b', 'return ($a === $b)?0:1;' ) ); // 对象数组,create_function,创建函数 } function bombardStrength() { $ret = 0; foreach( $this->units as $unit ) { $ret += $unit->bombardStrength(); } return $ret; }}// quick example classesclass Tank extends Unit { // 坦克 function addUnit( Unit $unit ) {} function removeUnit( Unit $unit ) {} function bombardStrength() { return 4; }}class Soldier extends Unit { // 士兵 function addUnit( Unit $unit ) {} function removeUnit( Unit $unit ) {} function bombardStrength() { return 8; }}$tank = new Tank();$tank2 = new Tank();$soldier = new Soldier();$army = new Army();$army->addUnit( $soldier );$army->addUnit( $tank );$army->addUnit( $tank2 );print_r( $army );print $army->bombardStrength()."/n";$army->removeUnit( $soldier );print_r( $army );print $army->bombardStrength()."/n";?>
新闻热点
疑难解答