真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP面向?qū)ο笾械脑L問者模式和組合模式的用法-創(chuàng)新互聯(lián)

本篇內(nèi)容主要講解“PHP面向?qū)ο笾械脑L問者模式和組合模式的用法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“PHP面向?qū)ο笾械脑L問者模式和組合模式的用法”吧!

站在用戶的角度思考問題,與客戶深入溝通,找到市中網(wǎng)站設(shè)計與市中網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋市中地區(qū)。

直接看代碼:

//被訪問者基類

abstract class Unit {
  abstract function bombardStrength();  //獲取單位的攻擊力
  

  //這個方法將調(diào)用訪問者類,并將自身傳遞給它
  function accept(ArmyVisitor $visitor){
    $method = "visit" . get_class($this);
    $visitor->$method($this);      //調(diào)用訪問者類的方法,這里使用了 "visit" . get_class($this) 組成了方法的名稱
  }
  

  //按原文的說法是設(shè)置一個深度,雖然之后會有調(diào)用但這個方法對于理解這個模式不重要可以不用管他(原文示例代碼中經(jīng)常有些跟理解模式原理沒太多關(guān)系的代碼)
  protected function setDepth($depth){
    $this->depth = $depth;
  }

  function getDepth(){
    return $this->depth;
  }
}

 

//弓箭手
class Archer extends Unit{
  function bombardStrength(){
    return 4;
  }
}

//激光炮

class LaserCannonUnit extends Unit{
  function bombardStrength(){
    return 44;
  }
}

//騎兵

class Cavalry extends Unit{
  function bombardStrength(){
    return 2;          //騎兵的攻擊力居然比弓箭手低?

  }
}

 

//用于組合繼承了unit類的實例,并讓Army和TroopCarrier類繼承removeUnit和addUnit方法,不放基類是因為上述的三個類已經(jīng)是最小單位了不是一個軍事集團removeUnit和addUnit方法對他們沒用。

abstract class CompositeUnit extends Unit{
  private $units = array();    //存放任何繼承了unit 類的實例

  function getComposite(){   //這個方法主要用于判斷當(dāng)前實例是否是一個 CompositeUnit 類
    return $this;
  }

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

  function removeUnit(Unit $unit){    //刪除一個軍事單位
    $this->units = array_udiff(
      $this->units,array($unit),

      function($a,$b){return ($a === $b)?0:1;}

    );  
  }

  function addUnit(Unit $unit){        //添加一個軍事單位
    if(in_array($unit,$this->units,true)){
      return;
    }
    $unit->setDepth($this->depth + 1);  
    $this->units[] = $unit;
  }

  function bombardStrength(){
    $ret = 0;
    foreach($this->units as $unit){
      $ret +=$unit->bombardStrength();
    }
    return $ret;
  }

  function accept(Armyvisitor $visitor){    //調(diào)用訪問者
    parent::accept($visitor);        //調(diào)用基類的accept方法,在第一個客戶端代碼條用里將會保存軍事集團整體的一個信息
    foreach($this->units as $thisunit){   //調(diào)用軍事單位accept方法,在第一個客戶端代碼條用里將會保存其中每一個軍事單位的信息
      $thisunit->accept($visitor);
    }
  }	
}

 

//軍隊

class Army extends CompositeUnit {

}

//艦隊

class TroopCarrier extends CompositeUnit {

}

 

//訪問者類

abstract class ArmyVisitor{
  abstract function visit(Unit $node);  //訪問者要執(zhí)行的業(yè)務(wù)邏輯
  function visitArcher(Archer $node){  //其實我覺得對于理解來說這個抽象類有一個抽象方法visit()就夠了,原文還多出下面這些方法來繞個圈調(diào)用visit

    //...... 
    $this->visit($node);
  }

  function visitCavalry(Cavalry $node){

    //.......
    $this->visit($node);
  }

  function visitLaserCannonUnit(LaserCannonUnit $node){

    //......
    $this->visit($node);
  }

  function visitTroopCarrierUnit(Cavalry $node){

    //......
    $this->visit($node);
  }

  function visitArmy(Cavalry $node){

    //......
    $this->visit($node);
  }
}

//這個訪問者類主要用于獲取并保存被訪問者對象的信息
class TextDumpArmyVisitor extends ArmyVisitor {
  private $text = "";
  function visit(Unit $node){
    $ret = "";
    $pad = 4 * $node->getDpth();
    $ret .= sprintf("%{$pad}s","");
    $ret .=get_class($node).": ";
    $ret .= "bombard: " . $node->bombardStrength() . "\n";
    $this->text .=$ret;
  }

  function getText(){
    return $this->text;
  }
}

//用于向每個對象征稅的訪問者類,客戶端代碼2中將會調(diào)用
class TaxCollectionVisitor extends ArmyVisitor{
  private $due=0;
  private $report ="";

  function visit(Unit $node){
    $this->levy($node,1);
  }

  function visitArcher(Archer $node){    //復(fù)寫了父類的方法,對于不同的單位征收不同的稅
    $this->levy($node,2);
  }

  function visitCavalry(Cavalry $node){
    $this->levy($node,3);
  }

  function visitTroopCarrierUnit(TroopCarrierUnit $node){
    $this->levy($node,5);
  }

  private function levy(Unit $unit,$amount){        //主要的業(yè)務(wù)邏輯
    $this->report .= "Tax levied for" . get_class($unit);
    $this->report .= ": $amount\n";
    $this->due +=$amount;
  }

  function getReport(){
    return $this->report;
  }

  function getTax(){
    return $this->due;
  }
}


//客戶端代碼1(獲取并輸出每個對象的一些信息)
class UnitScript {
  static function joinExisting(Unit $newUnit,Unit $occupyingUnit){
    $comp;
    if(!is_null($com = $occupyingUnit->getComposite())){
      $comp->addUnit($newUnit);
    } else {
      $comp = new Army();
      $comp->addUnit($occupyingUnit);
      $com->addUnit($newUnit);
    }
    return $comp;
  }
}

 

$main_army = new Army();
UnitScript::joinExisting(new Archer(),$main_army);
UnitScript::joinExisting(new LaserCannonUnit(),$main_army);
UnitScript::joinExisting(new Cavalry(),$main_army);

$textdump = new TextDumpArmyVisitor();
$main_army->accept($textdump);
print $textdump->getText();

 

//客戶端代碼2(對每個對象征稅,最后輸出總共征收了多少)
$main_army = new Army();
UnitScript::joinExisting(new Archer(),$main_army);
UnitScript::joinExisting(new LaserCannonUnit(),$main_army);
UnitScript::joinExisting(new Cavalry(),$main_army);
$taxcollector = new TaxCollectionVisitor();
$main_army->accept($taxcollector);
print $taxcollector->getTax();

    //上述的代碼因為太懶沒測試,抱歉! 感興趣的朋友就自己運行調(diào)試一下吧!

到此,相信大家對“PHP面向?qū)ο笾械脑L問者模式和組合模式的用法”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)建站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


本文名稱:PHP面向?qū)ο笾械脑L問者模式和組合模式的用法-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://weahome.cn/article/gpgcs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部