设计模式之责任链模式(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语言描述
责任链模式为请求创建了一个接受者对象的链.这种模式给予请求的类型,对请求的发送者和接受者进行解耦.这种类型的设计模式属于行为模式.在这种模式下,通常每个接收者都包含对另一个接收者的引用.如果一个对象不 ...
随机推荐
- 【Android】实验5 数独游戏界面设计-报告提交时间:2016.4.15
- 设计模式之单例模式与工厂模式的Python实现(一)
1. 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上 ...
- P3456 [POI2007]GRZ-Ridges and Valleys
题意翻译 给定一个地图,为小朋友想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两个格子有公共顶点,那么他们就是相邻的格子.(所以与(i,j)相邻的格子有(i ...
- [洛谷P4178]Tree
题目大意:给一棵树,问有多少条路径长度小于等于$k$ 题解:点分治 卡点:无 C++ Code: #include <cstdio> #include <algorithm> ...
- [洛谷P1792][国家集训队]种树
题目大意:给出由$n$个数组成的环,取某个数就可以得到它的分数,相邻的两个数不能同时取.问取$m$个数可以得到的最大分数. 题解:建一个大根堆,贪心取,每个点记录前驱后继,取一个点就把前驱后继设成不能 ...
- Codeforces 498D Traffic Jams in the Land | 线段树
题目大意: 给坐标轴1~n的点,每个点有一个权值,从一个点走到下一个点需要1s,如果当前时间是权值的倍数就要多花1s 给出q组操作,C表示单点修改权值,A表示询问0时刻x出发到y的时间 题解:因为权值 ...
- APIO2017游记
铁牌选手爆零滚粗记QAQ........ CCF说不让讨论APIO相关内容不过现在应该没事了吧QAQ day0:上午还在学校填清北夏令营的表,下午上火车去北京,晚上颓颓颓...... day1:上午网 ...
- SQL触发器(AFTER和INSTEAD OF)
转自:http://www.cnblogs.com/shepherldeng/archive/2010/06/23/1763766.html 何为触发器:触发器是数据库服务器中发生事件时自动执行的特种 ...
- 理想中的SQL语句条件拼接方式
背景 Orm用过一些,但处理增删改上面做的都不错.但是查询上跟我想要的效果总是差了一点.我想要的效果则是这样,基于某种命名规则进行传参,后台解析器知道命名规则即可知道它要查询什么样的数据. 谈谈我之前 ...
- python 二分法查找思考理解小白向け
首先说一下二分法查找的思路.这是面向小白的课程,大佬请让步谢谢 给定一个有序的序列(必须是排好序的)例如[1,2,3,4,5,6,7,8,9,10,20,30,400],然后我们查询一个元素出现的坐标 ...