<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                責任鏈(Chain of Responsibility)模式的定義:為了避免請求發送者與多個請求處理者耦合在一起,將所有請求的處理者通過前一對象記住其下一個對象的引用而連成一條鏈;當有請求發生時,可將請求沿著這條鏈傳遞,直到有對象處理它為止。 這種模式有另一種稱呼:控制鏈模式。它主要由一系列對于某些命令的處理器構成,每個查詢會在處理器構成的責任鏈中傳遞,在每個交匯點由處理器判斷是否需要對它們進行響應與處理。每次的處理程序會在有處理器處理這些請求時暫停。 在責任鏈模式中,客戶只需要將請求發送到責任鏈上即可,無須關心請求的處理細節和請求的傳遞過程,所以責任鏈將請求的發送者和請求的處理者解耦了。 **優點** 1. 降低了對象之間的耦合度。該模式使得一個對象無須知道到底是哪一個對象處理其請求以及鏈的結構,發送者和接收者也無須擁有對方的明確信息。 2. 增強了系統的可擴展性。可以根據需要增加新的請求處理類,滿足開閉原則。 3. 增強了給對象指派職責的靈活性。當工作流程發生變化,可以動態地改變鏈內的成員或者調動它們的次序,也可動態地新增或者刪除責任。 4. 責任鏈簡化了對象之間的連接。每個對象只需保持一個指向其后繼者的引用,不需保持其他所有處理者的引用,這避免了使用眾多的 **if** 或者 **if···else** 語句。 5. 責任分擔。每個類只需要處理自己該處理的工作,不該處理的傳遞給下一個對象完成,明確各類的責任范圍,符合類的單一職責原則。 **缺點** 1. 不能保證每個請求一定被處理。由于一個請求沒有明確的接收者,所以不能保證它一定會被處理,該請求可能一直傳到鏈的末端都得不到處理。 2. 對比較長的職責鏈,請求的處理可能涉及多個處理對象,系統性能將受到一定影響。 3. 職責鏈建立的合理性要靠客戶端來保證,增加了客戶端的復雜性,可能會由于職責鏈的錯誤設置而導致系統出錯,如可能會造成循環調用。 ## **模式的應用場景** 1. 有多個對象可以處理一個請求,哪個對象處理該請求由運行時刻自動確定。 2. 可動態指定一組對象處理請求,或添加新的處理者。 3. 在不明確指定請求處理者的情況下,向多個處理者中的一個提交請求。 #### **模式的結構** 1. 抽象處理者(Handler)角色:定義一個處理請求的接口,包含抽象處理方法和一個后繼連接。 2. 具體處理者(Concrete Handler)角色:實現抽象處理者的處理方法,判斷能否處理本次請求,如果可以處理請求則處理,否則將該請求轉給它的后繼者。 3. 客戶類(Client)角色:創建處理鏈,并向鏈頭的具體處理者對象提交請求,它不關心處理細節和請求的傳遞過程。 ![](https://img.kancloud.cn/98/3d/983d6eb1e917592ceab6241661cc915c_812x784.png) ``` //抽象處理者角色 abstract class Handler { private $next; //Handler public function setNext(Handler $next) { $this->next = $next; } /** * @return Handler [description] */ public function getNext() { return $this->next; } //處理請求的方法 abstract public function handleRequest(String $request); } //具體處理者角色1 class ConcreteHandler1 extends Handler { public function handleRequest(String $request) { if ($request === "one") { print_r("具體處理者1負責處理該請求!"); } else { if ($this->getNext() != null) { $this->getNext()->handleRequest($request); } else { print_r("沒有人處理該請求!"); } } } } //具體處理者角色2 class ConcreteHandler2 extends Handler { public function handleRequest(String $request) { if ($request === "two") { print_r("具體處理者2負責處理該請求!"); } else { if ($this->getNext() != null) { $this->getNext()->handleRequest(request); } else { print_r("沒有人處理該請求!"); } } } } class ChainOfResponsibilityPattern { public static function main() { //組裝責任鏈 $handler1 = new ConcreteHandler1(); $handler2 = new ConcreteHandler2(); $handler1->setNext($handler2); //提交請求 $handler1->handleRequest("two"); } } ChainOfResponsibilityPattern::main(); ``` 例子: ``` /** * 職責鏈模式 Chain of Responsibility * */ function output($string) { echo $string . "n"; } /** * 假如在公司里,如果你的請假時間小于0.5天,那么只需要向leader打聲招呼就OK了。   如果0.5<=請假天數<=3天,需要先leader打聲招呼,然后部門經理簽字。   如果3<請假天數,需要先leader打聲招呼,然后到部門經理簽字,最后總經經理確認簽字, 如果請假天數超過10天,是任何人都不能批準的。 */ /** * 抽象處理者角色(Handler:Approver):定義一個處理請求的接口,和一個后繼連接(可選) * */ abstract class Handler { protected $_handler = null; protected $_handlerName = null; /** * 設置下一層級 * @param [type] $handler [description] */ public function setSuccessor($handler) { $this->_handler = $handler; } protected function _success($request) { output(sprintf("%s's request was passed", $request->getName())); return true; } abstract public function handleRequest($request); } /** * 具體處理者角色1(ConcreteHandler:President):處理它所負責的請求,可以訪問后繼者,如果可以處理請求則處理,否則將該請求轉給他的后繼者。 * leader * */ class ConcreteHandlerLeader extends Handler { public function __construct($handlerName) { $this->_handlerName = $handlerName; } public function handleRequest($request) { if ($request->getDay() < 0.5) { output(sprintf('%s was told', $this->_handlerName)); // 已經跟leader招呼了 return $this->_success($request); } if ($this->_handler instanceof Handler) { return $this->_handler->handleRequest($request); } } } /** * 具體處理者角色2 * Manager 部門經理 * */ class ConcreteHandlerManager extends Handler { public function __construct($handlerName) { $this->_handlerName = $handlerName; } public function handleRequest($request) { if (0.5 <= $request->getDay() && $request->getDay() <= 3) { output(sprintf('%s signed', $this->_handlerName)); // 部門經理簽字 return $this->_success($request); } if ($this->_handler instanceof Handler) { return $this->_handler->handleRequest($request); } } } /** * 具體處理者角色3 * 總經理 */ class ConcreteHandlerGeneralManager extends Handler { public function __construct($handlerName) { $this->_handlerName = $handlerName; } public function handleRequest($request) { if (3 < $request->getDay() && $request->getDay() < 10) { output(sprintf('%s signed', $this->_handlerName)); // 總經理簽字 return $this->_success($request); } if ($this->_handler instanceof Handler) { return $this->_handler->handleRequest($request); } else { output(sprintf('no one can approve request more than 10 days')); } } } /** * 請假申請 * */ class Request { private $_name; private $_day; private $_reason; public function __construct($name = '', $day = 0, $reason = '') { $this->_name = $name; $this->_day = $day; $this->_reason = $reason; } public function setName($name) { $this->_name = $name; } public function getName() { return $this->_name; } public function setDay($day) { $this->_day = $day; } public function getDay() { return $this->_day; } public function setReason($reason) { $this->_reason = $reason; } public function getReason() { return $this->_reason; } } class Client { public static function test() { $leader = new ConcreteHandlerLeader('leader'); $manager = new ConcreteHandlerManager('manager'); $generalManager = new ConcreteHandlerGeneralManager('generalManager'); //請求實例 $request = new Request('ucai', 4, '休息'); $leader->setSuccessor($manager); //設置下一層級 $manager->setSuccessor($generalManager); //設置下一層級 //執行請求 $result = $leader->handleRequest($request); } } Client::test(); ``` ## **模式的擴展** 職責鏈模式存在以下兩種情況。 1. 純的職責鏈模式:一個請求必須被某一個處理者對象所接收,且一個具體處理者對某個請求的處理只能采用以下兩種行為之一:自己處理(承擔責任);把責任推給下家處理。 2. 不純的職責鏈模式:允許出現某一個具體處理者對象在承擔了請求的一部分責任后又將剩余的責任傳給下家的情況,且一個請求可以最終不被任何接收端對象所接收。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看