设计模式之责任链模式(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语言描述
责任链模式为请求创建了一个接受者对象的链.这种模式给予请求的类型,对请求的发送者和接受者进行解耦.这种类型的设计模式属于行为模式.在这种模式下,通常每个接收者都包含对另一个接收者的引用.如果一个对象不 ...
随机推荐
- POJ3680:Intervals(离散化+最大流最小费用)
Intervals Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 9320 Accepted: 4014 题目链接:ht ...
- DP———6.两个状态之间的 处理
Tickets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- MAC中如何配置两套android-sdk环境
1 背景介绍 随着android studio的完善和普及,越来越多Android app开发者从Eclipse+ADT环境转到Android Studio(后文统一用AS表示).但是,AS往往需要较 ...
- MFC 在窗口上画指定大小的ICON
CPaintDC dc(this); HICON hIcon = (HICON)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON) ...
- 封装removeClass()
<div class="box haha xixi">123</div> <script> function removeClass(eleme ...
- [HNOI2002] 公交车路线
题目背景 在长沙城新建的环城公路上一共有8个公交站,分别为A.B.C.D.E.F.G.H.公共汽车只能够在相邻的两个公交站之间运行,因此你从某一个公交站到另外一个公交站往往要换几次车,例如从公交站A到 ...
- YYH算组合数(NOIP模拟赛Round 6)
题目描述 YYH手上有一个长度为N的数列,而且这个数列正好能表示为.现在他想知道这个数列的最大公约数是多少,请你帮帮他 输入输出格式 输入格式: 每个数据点包括多组数据,以EOF结束 对于每个数据输入 ...
- 高级列表控件ListCtrl关联的MFC中的类:CListCtrl
高级列表控件ListCtrl关联的MFC中的类:CListCtrl■ 报表样式ListCtrl常用操作:1.添加列标题头:InsertColumn2.获取与设置列宽:GetColumnWidth.Se ...
- hdu 5720(贪心+区间合并)
Wool Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Subm ...
- Curl请求方法封装
/** * GET请求 * @param $url * @return bool|mixed */ function http_get($url) { $oCurl = curl_init (); i ...