> **設計模式-責任鏈模式**
## 說明 ##
**責任鏈模式( Chain of Responsibility Pattern): 為請求創建了一個接收者對象的鏈,并沿這條鏈傳遞該請求,直到有對象處理它為止。這種模式能夠給予請求的類型,對請求的發送者和接收者進行解耦。**
----------
##模式說明##
<h5>要解決的問題</h5>
> 1.當不確定該使用某個處理對象時,可動態指定一組對象來進行業務處理。
> 2.當需要進行任務層級遞交處理時,可以進行上級關聯,進行業務遞交申請。
<h5>適用的場景</h5>
> 1.流程審批
> 2.攔截器處理
> 3.日志系統搭建
> 4.laravel中間件
##示例代碼##
/**
* 責任鏈模式( Chain of Responsibility Pattern)
* 為請求創建了一個接收者對象的鏈,并沿這條鏈傳遞該請求,直到有對象處理它為止。這種模式能夠給予請求的類型,對請求的發送者和接收者進行解耦。
*/
header('Content-Type: text/plain');
//定義錯誤級別類,對不同的犯錯界別給與同的處理
class Info{
protected $levelNum=1;
protected $next='Warning';
public function process($level){
if($level <= $this->levelNum ){
echo "等級{$level}級別給予提示說明".PHP_EOL;
}else{
$objUp= new $this->next;
$objUp->process($level);
}
}
}
class Warning{
protected $levelNum=2;
protected $next='Error1';
public function process($level){
if($level <= $this->levelNum ){
echo "等級{$level}的錯誤給予口頭警告".PHP_EOL;
}else{
$objUp= new $this->next;
$objUp->process($level);
}
}
}
class Error1{
protected $levelNum=3;
public function process($level){
if($level <= $this->levelNum ){
echo "等級{$level}級別的錯誤給予制裁".PHP_EOL;
}else{
throw new Exception("最后一個級別必須處理,沒有處理,程序有問題");
}
}
}
$leave=1;
$obj= new Info();
$obj->process($leave);
$leave=2;
$obj->process($leave);
$leave=3;
$obj->process($leave);
----------
結果:
等級1級別給予提示說明
等級2的錯誤給予口頭警告
等級3級別的錯誤給予制裁
##責任鏈模式的其他問題##
一是性能問題,每個請求都是從鏈頭遍歷到鏈尾,特別是在鏈比較長的時候,性能是一個問題。二是調試不是很方便,特別是鏈條比較長的,環節比較多的時候,由于采用了類似遞歸的方式 ,調試的時候邏輯可能比較復雜。
## 結尾 ##
<p style="background-image: -webkit-linear-gradient(left, #3498db, #f47920 10%, #d71345 20%, #f7acbc 30%,#ffd400 40%, #3498db 50%, #f47920 60%, #d71345 70%, #f7acbc 80%, #ffd400 90%, #3498db);color: transparent;-webkit-text-fill-color: transparent;-webkit-background-clip: text;text-align:center;">
心如花木,向陽而生。
</p>
[1]: https://blog.zxliu.cn/usr/uploads/2020/11/2353528746.png
[2]: https://blog.zxliu.cn/usr/uploads/2020/11/1966401635.png