PHP经验分享

PHP设计模式-责任链模式

2018-12-07  本文已影响16人  PHP的艺术编程

责任链模式

情景

建立一个对象链,按照指定顺序处理调用;如果其中有一个对象无法处理当前的情况,移交下一个对象处理

例子

PHP代码

namespace ChainOfResponsibilities;

/**
 * handler 抽象类
 * Class Handler
 * @package ChainOfResponsibilities
 */
abstract class Handler
{
    /**
     * 定义下一级处理对象
     * @var null
     */
    private $successor = null;

    /**
     * 输入集成处理对象
     * Handler constructor.
     * @param Handler|null $handler
     */
    public function __construct(Handler $handler = null)
    {
        $this->successor = $handler;
    }

    /**
     * 通过使用模板方法模式这种方法可以确保每个子类不会忽略调用继承
     *
     * @param int $request
     * @return mixed
     */
    final public function handle(int $request)
    {
        $processed = $this->processing($request);
        if ($processed ===null) {
            // 请求尚未被目前的处理器处理 => 传递到下一个处理器。
            if ($this->successor !== null) {
                $processed = $this->successor->processing($request);
            }
        }

        return $processed;
    }

    abstract protected function processing(int $request);
}
namespace ChainOfResponsibilities;


class ConcreteHandler1 extends Handler
{
    /**
     * 处理
     * @param int $request
     * @return $this|null
     */
    protected function processing(int $request)
    {
        if ($request < 0) {
            echo "当前对象1:举报处理完毕" . '<br>';

            return $this;
        }

        return null;
    }
}
namespace ChainOfResponsibilities;


class ConcreteHandler2 extends Handler
{
    protected function processing(int $request)
    {
        if ($request > 0) {
            echo "当前对象2:举报处理完毕" . '<br>';

            return $this;
        }

        return null;
    }
}
<?php

use ChainOfResponsibilities\ConcreteHandler1;
use ChainOfResponsibilities\ConcreteHandler2;

// 注册自加载
spl_autoload_register(function ($class) {
    require dirname($_SERVER['SCRIPT_FILENAME']) . '//..//' . str_replace('\\', '/', $class) . '.php';
});

//设置责任链上下家
$handler1 = new ConcreteHandler1(new ConcreteHandler2());

$request = [1, -1, 2];
foreach ($request as $value) {
    $handler1->handle($value);
}

//输出结果
当前对象2:举报处理完毕
当前对象1:举报处理完毕
当前对象2:举报处理完毕

总结

上一篇 下一篇

猜你喜欢

热点阅读