设计模式之职责链模式--请求拦截器中间件审批流的原理

设计模式之职责链模式–请求拦截器中间件审批流的原理

职责链模式是定义一个链条,有不同的步骤,一步接一步完成。

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

为什么要使用职责链模式

职责链模式平时不怎么用。这个模式在一些框架中比较明显。

比如我们的中间件,每个中间件都有机会处理请求,并且可以中断请求,可以把请求传递给下一个中间件。这里的中间件可以理解为职责链上的具体处理类。

比如axios的拦截器,就类似中间件或者说职责链模式。

只有当我们的业务逻辑中出现这样场景才会用到职责链模式。

  • 每个职责类都可能处理请求。
  • 并且可以中断或者传递下去。

在语言中,switch-case也可以理解为职责链模式,里面的每一个case就是一个具体职责类,当一个case处理完后可以break中断整个链也可以传递下去。我们来实现一个类似的功能。

php 实现职责链模式

首先,同样有一个父类,所有这个链上的职责类都继承这个父类。

/**
 * 职责链模式
 * 职责链父类
 */
abstract class super {

    protected $chain;

    /**
     * 设置下一个处理类
     */
    function set(super $chain)
    {
        $this->chain = $chain;
    }

    //具体处理函数
    abstract function handle($req);
}

接下来比如实现两个case负责处理请求。

/**
 * 职责链模式
 * 职责类
 * 如果参数是1那么这个类处理不然转移到下一个类
 */
class chain1 {

    //具体处理函数
    function handle($req) {
        if ($req == 1) {
            //进行处理
            return true;
        }
        //不是1传递给下个类
        $this->chain->handle($req);
        
    }
}

/**
 * 职责链模式
 * 职责类
 * 如果参数是2那么这个类处理不然转移到下一个类
 */
class chain2 {

    //具体处理函数
    function handle($req) {
        if ($req == 2) {
            //进行处理
            return true;
        }
        //不是2传递给下个类
        $this->chain->handle($req);
        
    }
}

switch-case里面还有default用来处理最后的请求,同样可以添加一个最后的处理类作为链尾巴。

/**
 * 职责链模式
 * 职责类
 * 如果参数是都不满足就这个类来处理
 */
class end {

    //具体处理函数
    function handle($req) {
            //进行处理
            return true;
        
    }
}

上面的职责链功能就类似下面的代码


switch($req) {
    case 1:
        //处理
        break;
    case 2:
        break;
    default:

}

代码放在了我的github上面。

原创文章 84 获赞 7 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Thepatterraining/article/details/105998901
今日推荐