设计模式之职责链模式–请求拦截器中间件审批流的原理
职责链模式
是定义一个链条,有不同的步骤,一步接一步完成。
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
为什么要使用职责链模式
职责链模式平时不怎么用。这个模式在一些框架中比较明显。
比如我们的中间件
,每个中间件都有机会处理请求,并且可以中断请求,可以把请求传递给下一个中间件。这里的中间件可以理解为职责链上的具体处理类。
比如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上面。