PHP开发PHP经验分享

编程中的设计模式之责任链模式

2020-09-06  本文已影响0人  phpworkerman
定义

责任链模式(Chain Of Responsibility Pattern)是对针对请求者构建的接收者的链,这种模式对请求者和接收者进行解耦,属于行为型模式。

代码实例

现有三种级别的错误日志,notice, error, warning ,当客户端发送请求记录日志时,根据错误级别记录到不同的日志中。责任链模式对于请求者和接收者进行解耦,在该例中,这三个类构建出了一个响应链条,当请求进入到这个链中时,会根据条件对比,不符合要求的进入下一环节,直至链的末端或有合适条件时结束请求,返回响应。

<?php
abstract class Log
{
    const NOTICE_CODE  = 1;
    const ERROR_CODE   = 2;
    const WARNING_CODE = 3;

    public $level;
    public $nextLog = null;

    abstract public function write($msg);

    public function setNextLog($logObject)
    {
        $this->nextLog = $logObject;
    }

    public function setLogMessage($level, $msg)
    {
        if($level >= $this->level){
            return $this->write($msg);
        }

        if($this->nextLog !== null){
            return $this->nextLog->setLogMessage($level, $msg);
        }

        return false;
    }
}

class NoticeLog extends Log
{
    public function __construct()
    {
        $this->level = self::NOTICE_CODE;
    }

    public function write($msg)
    {
        echo 'NoticeLog: ' . $msg . '<br>';
    }
}
class ErrorLog extends Log
{
    public function __construct()
    {
        $this->level = self::ERROR_CODE;
    }

    public function write($msg)
    {
        echo 'ErrorLog: ' . $msg . '<br>';
    }
}
class WarningLog extends Log
{
    public function __construct()
    {
        $this->level = self::WARNING_CODE;
    }

    public function write($msg)
    {
        echo 'WarningLog: ' . $msg . '<br>';
    }
}

class ChainDemo
{
    public function setLogMsg()
    {
        $noticeLog = new NoticeLog();
        $errorLog = new ErrorLog();
        $warningLog = new WarningLog();

        $warningLog->setNextLog($errorLog);
        $errorLog->setNextLog($noticeLog);

        $warningLog->setLogMessage(Log::NOTICE_CODE,'notice 错误提示');
        $warningLog->setLogMessage(Log::ERROR_CODE,'error 错误提示');
        $warningLog->setLogMessage(Log::WARNING_CODE,'warning 错误提示');
    }
}
$chain = new ChainDemo();
$chain->setLogMsg();
总结

责任链模式适合多个对象处理一个请求时使用,它构建了一个灵活的响应链路,扩展新的处理类非常方便,但该模式需要设计好链路的跳出规则,以及无对应处理类时的程序响应内容。

上一篇 下一篇

猜你喜欢

热点阅读