PHP責任鏈編程模式

來源:互聯網
上載者:User
本文主要介紹了PHP的責任鏈編程模式,也是Team Dev廣泛採用的一種編程方式約定。希望對大家有所協助。

概述
責任鏈模式是一種對象的行為模式。在責任鏈模式裡,很多個物件由每一個對象對其下家的引用而串連起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的用戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響用戶端的情況下動態重新組織和分配責任


責任鏈模式的定義
使多個對象都有機會處理請求,從而避免了請求的寄件者和接受者之間耦合關係,將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有對象處理它為止。

責任鏈模式的優點
最為顯著的優點就是將請求和處理分開。要求者可以不用知道是誰處理的,處理者可以不用知道請求的全貌,兩者解耦,提高系統的靈活性。

責任鏈模式的缺點
一是效能問題,每個請求都是從鏈頭遍曆到鏈尾,特別是在鏈比較長的時候,效能是一個問題。二是調試不是很方便,特別是鏈條比較長的,環節比較多的時候,由於採用了類似遞迴的方式 ,調試的時候邏輯可能比較複雜。


責任鏈模式涉及到的角色如下:

抽象處理者(Handler)角色:定義出一個處理請求的介面。如果需要,介面可以定義出一個方法以設定和返回對下家的引用。這個角色通常由一個php的抽象類別或介面實現。中Handler類的彙總關係給出了具體子類對下家的引用,抽象方法handleRequest()規範了子類處理請求的操作
具體處理者(ConcreateHandle)角色:具體處理者接到請求後,可以選擇將請求處理掉,或者將請求傳給下家。由於具體處理者持有對下家的引用,因此,如果需要,具體處理這可以訪問下家


來看一個PHP的責任鏈模式編程執行個體:

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

通過代碼可以看出,用戶端建立了兩個處理者對象,並指定第一個處理者對象的下家是第二個處理者對象,而第二個處理者對象卻沒有下家。然後用戶端將請求傳遞給第一個處理者對象

相關推薦:

PHP狀態模式編程

PHP 單例模式實現

php Factory 方法模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.