溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP中責(zé)任鏈編程模式的示例分析

發(fā)布時間:2021-09-02 14:07:30 來源:億速云 閱讀:102 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細講解有關(guān)PHP中責(zé)任鏈編程模式的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

概述
責(zé)任鏈模式是一種對象的行為模式。在責(zé)任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發(fā)出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)的重新組織和分配責(zé)任

責(zé)任鏈模式的定義
使多個對象都有機會處理請求,從而避免了請求的發(fā)送者和接受者之間耦合關(guān)系,將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有對象處理它為止。
責(zé)任鏈模式的優(yōu)點
最為顯著的優(yōu)點就是將請求和處理分開。請求者可以不用知道是誰處理的,處理者可以不用知道請求的全貌,兩者解耦,提高系統(tǒng)的靈活性。  
責(zé)任鏈模式的缺點
一是性能問題,每個請求都是從鏈頭遍歷到鏈尾,特別是在鏈比較長的時候,性能是一個問題。二是調(diào)試不是很方便,特別是鏈條比較長的,環(huán)節(jié)比較多的時候,由于采用了類似遞歸的方式 ,調(diào)試的時候邏輯可能比較復(fù)雜。

責(zé)任鏈模式涉及到的角色如下:

    抽象處理者(Handler)角色:定義出一個處理請求的接口。如果需要,接口可以定義出一個方法以設(shè)定和返回對下家的引用。這個角色通常由一個php的抽象類或接口實現(xiàn)。上圖中Handler類的聚合關(guān)系給出了具體子類對下家的引用,抽象方法handleRequest()規(guī)范了子類處理請求的操作
    具體處理者(ConcreateHandle)角色:具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于具體處理者持有對下家的引用,因此,如果需要,具體處理這可以訪問下家

來看一個PHP的責(zé)任鏈模式編程實例: 

  <?php 
   
  /** 
   * 抽象處理者角色 
   * @author wzy 
   * 
   */ 
  abstract class Handle 
  { 
   
    /** 
     * 持有后繼的責(zé)任對象 
     * 
     * @var object 
     */ 
    protected $successor; 
   
    /** 
     * 示意處理請求的方法,雖然這個示意方法是沒有傳入?yún)⑺氐?nbsp;
     * 但實際是可以傳入?yún)?shù)的,根據(jù)具體需要來選擇是否傳遞參數(shù) 
     */ 
    public abstract function handleRequest (); 
   
    /** 
     * 取值方法 
     * 
     * @return object 
     */ 
    public function getSuccessor () 
    { 
      return $this->successor; 
    } 
   
    /** 
     * 賦值方法,設(shè)置后繼的責(zé)任對象 
     * 
     * @param object $objsuccessor       
     */ 
    public function setSuccessor ($objsuccessor) 
    { 
      $this->successor = $objsuccessor; 
    } 
  } 
   
  /** 
   * 具體處理者角色 
   * 
   * @author wzy 
   *     
   */ 
  class ConcreateHandler extends Handle 
  { 
   
    /** 
     * 判斷是否有后繼的責(zé)任對象 
     * 如果有,就轉(zhuǎn)發(fā)請求給后繼的責(zé)任對象 
     * 如果沒有,則處理請求 
     * 
     * @see Handle::handleRequest() 
     */ 
    public function handleRequest () 
    { 
      if ($this->getSuccessor() != null) { 
        echo "放過請求,將請求轉(zhuǎn)發(fā)給后繼的責(zé)任對象!<br>"; 
        $this->getSuccessor()->handleRequest(); 
      } else { 
        echo "處理請求,處理過程省略...<br>"; 
      } 
    } 
  } 
   
  /** 
   * 客戶端代碼 
   */ 
   
  // 組裝責(zé)任鏈 
  $handle1 = new ConcreateHandler(); 
  $handle2 = new ConcreateHandler(); 
  $handle1->setSuccessor($handle2); 
   
  // 提交請求 
  $handle1->handleRequest(); 
  ?>

通過代碼可以看出,客戶端創(chuàng)建了兩個處理者對象,并指定第一個處理者對象的下家是第二個處理者對象,而第二個處理者對象卻沒有下家。然后客戶端將請求傳遞給第一個處理者對象

關(guān)于“PHP中責(zé)任鏈編程模式的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI