编程中的设计模式之责任链模式
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();
总结
责任链模式适合多个对象处理一个请求时使用,它构建了一个灵活的响应链路,扩展新的处理类非常方便,但该模式需要设计好链路的跳出规则,以及无对应处理类时的程序响应内容。