设计模式-责任链模式

设计模式-责任链模式

说明

责任链模式( 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级别的错误给予制裁

责任链模式的其他问题

一是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个问题。二是调试不是很方便,特别是链条比较长的,环节比较多的时候,由于采用了类似递归的方式 ,调试的时候逻辑可能比较复杂。

结尾

心如花木,向阳而生。

添加新评论