设计模式-责任链模式
说明
责任链模式( 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级别的错误给予制裁
责任链模式的其他问题
一是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个问题。二是调试不是很方便,特别是链条比较长的,环节比较多的时候,由于采用了类似递归的方式 ,调试的时候逻辑可能比较复杂。
结尾
心如花木,向阳而生。