最近重構代碼發現責任鏈模式很是實用,因此簡單總結了一下。整體來講,責任鏈模式更像是一種簡化多種場景下調用處理的一種設計模式,特別適合if-else分支判斷不少的場景。好比是根據不一樣會員等級給予不一樣的優惠力度。php
它的定義:對象的調用是由下家的應用鏈接起來的處理鏈。一直不斷在鏈上傳遞,直到有某個對象能夠處理爲止。設計模式
我我的的理解:就像一我的要舉報某個高官貪污,要先從當地法院進行提案舉報,當地法院權限不足,而後將這個事兒繼續上報給中級人民法院,中級人民法院發現無權處理,又把舉報再上報給最高法,in the end 最高法依法受理。this
它的好處:spa
1.解耦。使用單一職責的處理類去處理不一樣場景條件下的業務,達到解耦,方便後期擴展和維護。設計
2.客戶端無感。請求方不用知道具體是哪一個處理類完成了請求處理,將處理過程交給系統內部。code
3.可擴展性。能夠動態從新組織鏈式和分配責任,當有新的case的時候就增長一個節點處理類便可,不用改變調用過程。orm
具體例子以下:對象
<?php /** * Created by PhpStorm. * User: tonny */ abstract class Handler { protected $higher = null; abstract public function operation($lev); }
// 房間主人 class RoomMaster extends Handler { protected $higher = "admin"; public function operation($lev) { // TODO: Implement operation() method. if ($lev <= 1) { echo "房間主人搞定!"; } else { $higher = $this->higher; $this->higher = new $higher(); $this->higher->operation($lev); } } }
// 管理員 class Admin extends Handler { protected $higher = "God"; public function operation($lev) { // TODO: Implement operation() method. if ($lev <= 50) { echo "Admin搞定"; } else { echo "God搞定"; } } } $try = new RoomMaster(); $lev = rand(0, 100); $try->operation($lev);
總結:利用php的動態特性,將下一個節點的類保存在每一個處理類中的$higher變量中,經過$lev來判斷是當前處理類是否處理得過來,若是能處理則處理,不能處理則交給$higher。blog