首页 > 开发 > PHP > 正文

PHP面向对象程序设计组合模式与装饰模式详解

2024-05-04 22:50:36
字体:
来源:转载
供稿:网友

本文实例讲述了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";?>            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表