设计模式之责任链模式(php实现)
github地址:https://github.com/ZQCard/design_pattern
/**
* 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。
* 这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
* 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,
* 那么它会把相同的请求传给下一个接收者,依此类推。
* 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
* 优点:
* 1、降低耦合度。它将请求的发送者和接收者解耦。
* 2、简化了对象。使得对象不需要知道链的结构。
* 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
* 4、增加新的请求处理类很方便。
* 缺点:
* 1、不能保证请求一定被接收。
* 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
* 3、可能不容易观察运行时的特征,有碍于除错。
* 例子以日志错误级别记录为例
*/
(1)AbstractLogger.class.php(抽象日志父类)
<?php namespace ChainOfResponsibility; abstract class AbstractLogger
{
public static $INFO = 1;
public static $DEBUG = 2;
public static $ERROR = 3; protected $level; protected $nextLogger; public function setNextLogger(AbstractLogger $nextLogger)
{
$this->nextLogger = $nextLogger;
} public function logMessage($level, $message)
{
if ($this->level <= $level){
$this->write($message);
} if ($this->nextLogger != null){
$this->nextLogger->logMessage($level, $message);
}
} abstract protected function write($message);
}
(2)ErrorLogger.class.php(错误级别日志处理类)
<?php namespace ChainOfResponsibility; class ErrorLogger extends AbstractLogger
{ public function __construct($level)
{
$this->level = $level;
} protected function write($message)
{
echo "Error Error::Logger: " . $message;
echo '<br/>';
}
}
(3)DebugLogger.class.php(调试级别处理类)
<?php namespace ChainOfResponsibility; class DebugLogger extends AbstractLogger
{ public function __construct($level)
{
$this->level = $level;
} protected function write($message)
{
echo "Error File::Logger: " . $message;
echo '<br/>';
}
}
(4)ConsoleLogger.class.php(消息级别处理类)
<?php namespace ChainOfResponsibility; class ConsoleLogger extends AbstractLogger
{ public function __construct($level)
{
$this->level = $level;
} protected function write($message)
{
echo "Error Console::Logger: " . $message;
echo '<br/>';
}
}
(5)chainOfResponsibility.php(客户端)
<?php /**
* 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。
* 这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
* 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,
* 那么它会把相同的请求传给下一个接收者,依此类推。
* 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
* 优点:
* 1、降低耦合度。它将请求的发送者和接收者解耦。
* 2、简化了对象。使得对象不需要知道链的结构。
* 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
* 4、增加新的请求处理类很方便。
* 缺点:
* 1、不能保证请求一定被接收。
* 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
* 3、可能不容易观察运行时的特征,有碍于除错。
*
*/ spl_autoload_register(function ($className){
$className = str_replace('\\','/',$className);
include $className.".class.php";
}); use ChainOfResponsibility\ErrorLogger;
use ChainOfResponsibility\AbstractLogger;
// 生成责任链
function getChainOfLoggers(){
$errorLogger = new ErrorLogger(AbstractLogger::$ERROR);
$debugLogger = new ErrorLogger(AbstractLogger::$DEBUG);
$consoleLogger = new ErrorLogger(AbstractLogger::$INFO); $errorLogger->setNextLogger($debugLogger);
$debugLogger->setNextLogger($consoleLogger);
return $errorLogger;
} $loggerChain = getChainOfLoggers();
/**
Error Error::Logger: This is an information.
Error Error::Logger: This is an debug information.
Error Error::Logger: This is an debug information.
Error Error::Logger: This is an error information.
Error Error::Logger: This is an error information.
Error Error::Logger: This is an error information.
*/
$loggerChain->logMessage(AbstractLogger::$INFO, "This is an information.");
$loggerChain->logMessage(AbstractLogger::$DEBUG, "This is an debug information.");
$loggerChain->logMessage(AbstractLogger::$ERROR, "This is an error information.");
设计模式之责任链模式(php实现)的更多相关文章
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...
- php设计模式之责任链模式
php设计模式之责任链模式 实际问题 你的论坛有举报功能,版主能解决粗口方面的举报,警察能解决严重一点的黄赌毒方面的举报,更严重的反政府的举报就需要由国安局来完成. 职场中每个人都有直属的上级,如果到 ...
- python设计模式之责任链模式
python设计模式之责任链模式 开发一个应用时,多数时候我们都能预先知道哪个方法能处理某个特定请求.然而,情况并非总是如此.例如,想想任意一种广播计算机网络,例如最早的以太网实现.在广播计算机网络中 ...
- 【GOF23设计模式】责任链模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_责任链模式.公文审批.供应链系统的采购审批.异常链.过滤器和拦截器调用过程 package com.test.chainO ...
- C#设计模式:责任链模式
设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了 ...
- 详解java设计模式之责任链模式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...
- Head First设计模式之责任链模式
一.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 主要解决:职责链上的处理者负责处理请求,客户只需要将请求 ...
- 【Unity与23种设计模式】责任链模式(Chain of Responsibility)
GoF中定义: "让一群对象都有机会来处理一项请求,以减少请求发送者与接收者之间的耦合度.将所有的接受对象串联起来,让请求沿着串接传递,直到有一个对象可以处理为止." 举个现实中的 ...
- Java进阶篇设计模式之八 ----- 责任链模式和命令模式
前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...
- 设计模式之责任链模式——Java语言描述
责任链模式为请求创建了一个接受者对象的链.这种模式给予请求的类型,对请求的发送者和接受者进行解耦.这种类型的设计模式属于行为模式.在这种模式下,通常每个接收者都包含对另一个接收者的引用.如果一个对象不 ...
随机推荐
- Win10 Ubuntu18.04 编译安装 nignx
nginx 下载页 http://nginx.org/en/download.html wget http://nginx.org/download/nginx-1.14.0.tar.gz //安装依 ...
- user-select & css
user-select & css https://developer.mozilla.org/en-US/docs/Web/CSS/user-select https://css-trick ...
- Python列表及元组操作
#列表(一组有序数据的组合就是列表) #创建列表 #空列表 var = list()#var = [] print(var,type(var)) #具有多个元素的列表 var = ['风','水',' ...
- POJ 1061 青蛙的约会 | 同余方程和exGcd
题解: 要求s+px=t+qx (mod L) 移项 (p-q)x=t-s (mod L) 等价于 (p-q)x+Ly=t-s 即ax+by=c的方程最小非负根 exGcd后乘个C #include& ...
- CSU 2031
2031: Barareh on Fire Submit Page Summary Time Limit: 3 Sec Memory Limit: 512 Mb Submitt ...
- Netapp exportfs NFS Config CLI Guide
Netapp exportfs NFS Config CLI Guide A quick and simple Netapp NFS configuration guide with commands ...
- RSA加密/解密 Decryption error异常解决
RSA加密/解密 Decryption error异常解决 import java.io.ByteArrayOutputStream; import java.security.Key; import ...
- AngularJS 作用域与数据绑定机制
AngularJS 简介 AngularJS 是由 Google 发起的一款开源的前端 MVC 脚本框架,既适合做普通 WEB 应用也可以做 SPA(单页面应用,所有的用户操作都在一个页面中完成).与 ...
- TemplateBinding和Binding
TemplateBinding是Binding的一个轻量级版本,它失去了成熟版本Binding的很多功能,比如继承内容引用(inheritence context referencing),Relat ...
- VS MFC RADIO控件 选择
我们假设有两个RADIO控件:IDC_RADIO_SINGLE和IDC_RADIO_RANGE,我们的目的是默认选种IDC_RADIO_SINGLE控件. 方法一: CheckRadioButton( ...