1. 程式人生 > 其它 >PHP設計模式—職責鏈模式

PHP設計模式—職責鏈模式

定義:

職責鏈模式(Chain of Responsibility):使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件處理它為止。

結構:

  • Handler:抽象類,定義一個處理請示的介面。
  • ConcreteHandler:具體處理者類,處理它所負責的請求,可訪問它的後繼者,如果可以處理該請求,就處理之,否則就將請求轉發給它的後繼者。
  • Client:客戶端程式碼。

程式碼例項:

/**
 * 抽象類,定義一個處理請示的介面
 * Class Handler
 */
abstract class Handler
{
    
/** * 存放下一個處理物件 * @var */ protected $nextHandler; /** * 設定下一個處理物件 * @param Handler $handler */ public function setNextHandler(Handler $handler) { $this->nextHandler = $handler; } /** * 抽象方法,由具體處理者類實現 * @param $request * @return mixed
*/ abstract public function handlerRequest($request); } /** * 具體處理者類 * Class ConcreteHandler1 */ class ConcreteHandler1 extends Handler { /** * 具體處理邏輯 * @param $request * @return mixed|void */ public function handlerRequest($request) { // TODO: Implement handlerRequest() method.
if ($request >= 0 && $request < 10) { // ConcreteHandler1可以處理0~10的請求 echo 'ConcreteHandler1處理這個請求<br>'; } elseif ($this->nextHandler) { // 請求轉發給下一個處理物件 $this->nextHandler->handlerRequest($request); } else { echo 'ConcreteHandler1處理異常<br>'; } } } /** * 具體處理者類 * Class ConcreteHandler2 */ class ConcreteHandler2 extends Handler { /** * 具體處理邏輯 * @param $request * @return mixed|void */ public function handlerRequest($request) { // TODO: Implement handlerRequest() method. if ($request >= 10 && $request < 20) { // ConcreteHandler2可以處理10~20的請求 echo 'ConcreteHandler2處理這個請求<br>'; } elseif ($this->nextHandler) { // 請求轉發給下一個處理物件 $this->nextHandler->handlerRequest($request); } else { echo 'ConcreteHandler2處理異常<br>'; } } } /** * 具體處理者類 * Class ConcreteHandler3 */ class ConcreteHandler3 extends Handler { /** * 具體處理邏輯 * @param $request * @return mixed|void */ public function handlerRequest($request) { // TODO: Implement handlerRequest() method. if ($request >= 20) { // ConcreteHandler3可以處理大於20的請求 echo 'ConcreteHandler3處理這個請求<br>'; } elseif ($this->nextHandler) { // 請求轉發給下一個處理物件 $this->nextHandler->handlerRequest($request); } else { echo 'ConcreteHandler3處理異常<br>'; } } } // 客戶端程式碼 // 例項化處理者 $handler1 = new ConcreteHandler1(); $handler2 = new ConcreteHandler2(); $handler3 = new ConcreteHandler3(); // 職責鏈組裝,定義鏈的結構,設定職責鏈上家與下家 $handler1->setNextHandler($handler2); $handler2->setNextHandler($handler3); // 呼叫請求 $handler1->handlerRequest(5); $handler1->handlerRequest(15); $handler1->handlerRequest(35); // 結果 ConcreteHandler1處理這個請求 ConcreteHandler2處理這個請求 ConcreteHandler3處理這個請求

總結:

  • 當客戶提交一個請求時,請求是沿鏈傳遞直至有一個ConcreteHandler物件負責處理它。
  • 職責鏈模式中接收者和傳送者都沒有對方的明確資訊,且鏈中的物件自己也並不知道鏈的結構。所以職責鏈可簡化物件的相互連線,它們僅需保持一個指向其後繼者的引用,而不需要保持它所有的候選接受者的引用,這大大降低了耦合度。
  • 由於是在客戶端來定義鏈的結構,可以隨時地增加或修改處理一個請求的結構,增強了給物件指派職責的靈活性。
  • 需要注意的是,一個請求極有可能到了鏈的末端都得不到處理,或者因為沒有正確配置而得不到處理,因此需要事先考慮全面。