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 协议》,转载必须注明作者和本文链接
lemon_lyue
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!