设计模式之责任链模式(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语言描述
责任链模式为请求创建了一个接受者对象的链.这种模式给予请求的类型,对请求的发送者和接受者进行解耦.这种类型的设计模式属于行为模式.在这种模式下,通常每个接收者都包含对另一个接收者的引用.如果一个对象不 ...
随机推荐
- php session 测试
2018-06-22 08:26:30 session指的是默认php提供的文件session形式 当前我的认识是,php并不记录session的过期时间,但是php.ini中有session的垃圾回 ...
- 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路
原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html 题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串 ...
- CSLM 配置粗解
CSLM工具(continuous space language model toolkit)用于训练NNLM,支持SRILM.KENLM(默认)语言模型工具,CUDA加速,CSTM统计机器翻译. 本 ...
- 洛谷 P2485 [SDOI2011]计算器 解题报告
P2485 [SDOI2011]计算器 题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最 ...
- [解决方案]未能找到路径“~\bin\roslyn\csc.exe”的一部分
我的WebApi项目使用Nuget加载了一些包以后出现了这样的问题,本地可以访问,但发布到线上后,出现这样的报错 这个问题出现的原因是Nuget的时候,多加载了一些项目可能不需要的依赖库所导致的. 解 ...
- 0-1背包问题(经典)HDU2602 Bone Collector
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- node_module删除
https://segmentfault.com/q/1010000002972327 npm install rimraf -g rimraf node_modules
- 遍历Collection集合中的6种方法:
下面的代码演示了遍历Collection集合的6种方法,注意Collection集合的遍历远不止于增强for循环,和迭代器两种. 代码如下: package com.qls.traverse; imp ...
- Robocopy用法
----------------[参数]-------------------robocopy /?------------------------------------------------- ...
- 转 Linux内存管理原理
Linux内存管理原理 在用户态,内核态逻辑地址专指下文说的线性偏移前的地址Linux内核虚拟3.伙伴算法和slab分配器 16个页面RAM因为最大连续内存大小为16个页面 页面最多16个页面,所以1 ...