PHP-责任链模式
什么是责任链模式
责任链模式(Chain Of Responisibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
责任链模式的实现
这里用责任链模式写一个中间件来做示范,先新建一个抽象中间件处理类
Middleware\MiddlewareHandler.php
<?php
namespace Middleware;
/**
* Class MiddlewareHandler
* @package Middleware
*/
abstract class MiddlewareHandler
{
// 下一个处理者
private $nextHandler;
/**
* @desc 处理方法
* @return mixed
*/
abstract protected function handler();
/**
* @desc 设置下一个处理者
* @param MiddlewareHandler $handler
* @return $this
*/
public function setNextHandler(MiddlewareHandler $handler)
{
$this->nextHandler = $handler;
return $this;
}
/**
* @desc 责任链实现方法
*/
final public function handlerMessage()
{
$this->handler();
if (!empty($this->nextHandler)) {
$this->nextHandler->handlerMessage();
}
}
}
写好了抽象类之后就可以实现具体的中间件类去继承该抽象类了。中间件一般去校验签名校验jwt登录等等。
Middleware\CheckSign.php
<?php
namespace Middleware;
class CheckSign extends MiddlewareHandler
{
protected function handler()
{
echo 'check sign...'.PHP_EOL;
}
}
Middleware\CheckJwt.php
<?php
namespace Middleware;
class CheckJwt extends MiddlewareHandler
{
protected function handler()
{
echo 'check jwt...'.PHP_EOL;
}
}
中间件已经实现完成了,万事俱备只欠调用
这里实现一个index.php,这里使用了两种方式去调用,一种是手动去构建责任链去调用,另外一种是将需要构建的责任链存于数组,程序去构建责任链
index.php
<?php
use Middleware\RegisterMiddleware;
spl_autoload_register(function($class_name) {
require_once str_replace('\\','/',$class_name).'.php';
});
/**
* @desc 自动实例化构建责任链
*/
new RegisterMiddleware();
/**
* @desc 手动构建
*/
use Middleware\CheckJwt;
use Middleware\CheckSign;
$checkJwt = new CheckJwt();
$checkSign = new CheckSign();
$checkSign->setNextHandler($checkJwt);
$checkSign->handlerMessage();
程序构建责任链代码如下
Middleware\RegisterMiddleware.php
<?php
namespace Middleware;
class RegisterMiddleware
{
/**
* @desc 配置中间件,责任顺序与数组内顺序一致
* @var array
*/
protected $middlewareArr = [
CheckSign::class,
CheckJwt::class,
];
protected $handler;
protected $middleware;
/**
* @desc 构造方法自动构建责任链
* RegisterMiddleware constructor.
*/
public function __construct()
{
foreach ($this->middlewareArr as $key => $item) {
$next = isset($this->middlewareArr[$key + 1]) ? $this->middlewareArr[$key + 1] : null;
if ($key === 0) {
$this->handler = new $item();
if (!empty($next)) {
$this->middleware = new $next();
$this->handler->setNextHandler($this->middleware);
}
} elseif (!empty($next)) {
$mid = new $next();
$this->middleware->setNextHandler($mid);
}
}
$this->handler->handlerMessage();
}
}
责任链模式应用场景
责任链模式主要可以去实现过滤器拦截器、中间件和工作流等
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: