> **设计模式-责任链模式**
## 说明 ##
**责任链模式( 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