B5:责任链模式 Chain Of Responsibility
使多个对象都有机会处理处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着该链处理请求,直到有一个对象能够处理它为止.
相当于switch/case,在客户端指定了每一链的下一链.
UML

示例代码:
abstract class Handle
{
protected $nextHandle; public function setNextHandle(Handle $handle)
{
$this->nextHandle = $handle;
} abstract public function handleRequest($level);
} class Handle1 extends Handle
{
public function handleRequest($level)
{
if ($level > 0 && $level < 10) {
echo 'Handle1 处理了';
} elseif(!is_null($this->nextHandle)) {
$this->nextHandle->handleRequest($level);
}
}
} class Handle2 extends Handle
{
public function handleRequest($level)
{
if ($level > 10 && $level < 100) {
echo 'Handle2 处理了';
} elseif(!is_null($this->nextHandle)) {
$this->nextHandle->handleRequest($level);
}
}
} class Handle3 extends Handle
{
public function handleRequest($level)
{
if ($level > 100 && $level < 1000) {
echo 'Handle3 处理了';
} elseif(!is_null($this->nextHandle)) {
$this->nextHandle->handleRequest($level);
}
}
} $handle1 = new Handle1();
$handle2 = new Handle2();
$handle3 = new Handle3();
$handle1->setNextHandle($handle2);
$handle2->setNextHandle($handle3); $handle1->handleRequest(600);
这个手动设置下一处理者,还是有点不方便.有时候设置出错,容易导致死循环,我们改进一下.
示例代码:
abstract class Handle
{
abstract public function handleRequest($level);
} class Handle1 extends Handle
{
public function handleRequest($level)
{
if ($level > 0 && $level < 10) {
echo 'Handle1 处理了';
return true;
}
}
} class Handle2 extends Handle
{
public function handleRequest($level)
{
if ($level > 10 && $level < 100) {
echo 'Handle2 处理了';
return true;
}
}
} class Handle3 extends Handle
{
public function handleRequest($level)
{
if ($level > 100 && $level < 1000) {
echo 'Handle3 处理了';
return true;
}
}
} class Context
{
protected $chains = []; public function addHandle(Handle $handle)
{
$this->chains[] = $handle;
} public function handleRequest($level)
{
foreach ($this->chains as $handler) {
if ($handler->handleRequest($level)) {
break;
}
}
}
} $context = new Context();
$context->addHandle(new Handle1());
$context->addHandle(new Handle2());
$context->addHandle(new Handle3()); $context->handleRequest(600);
我们将链的设置交给Context,Context维护了一个数组来保存设置的处理者.context中的handleRequest方法,循环从数组中读取并处理.在每个处理者类中,我们让其如果有处理,就返回true,在foreach循环中跳出循环,防止无用的循环继续下去.
当然有时候我们需要职责链的每个处理者挨个处理请求,也可以使用这种方法.
B5:责任链模式 Chain Of Responsibility的更多相关文章
- 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)
责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...
- 责任链模式-Chain of Responsibility(Java实现), 例2
责任链模式-Chain of Responsibility 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 咱们在 ...
- 责任链模式-Chain of Responsibility(Java实现), 例1
责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. ...
- 责任链模式/chain of responsibility/行为型模式
职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...
- 《JAVA设计模式》之责任链模式(Chain of Responsibility)
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- 23种设计模式--责任链模式-Chain of Responsibility Pattern
一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...
- 责任链模式-Chain of Responsibility
责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 责任链模式结构图: 代码实现: 责任链模式 ...
- 设计模式之二十:责任链模式(Chain of Responsibility)
感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有 ...
随机推荐
- layer close 关闭层IE9-浏览器崩溃问题解决
针对ayer弹出层在IE上关闭导致浏览器崩溃的问题: 导致原因: 查看src源码,layer.close关闭总方法中有这么一行: layer.close = function(index){ ] + ...
- Vmware vSphere常见问题及解决办法
Vmware vSphere常见问题及解决办法 日期:2012-6-29来源:51cto Vmware vSphere 12 1. 虚拟机文件被锁,无法正常 power on 故障状态: 启动虚拟 ...
- (1)Maven安装及配置
一.下载 http://maven.apache.org/download.cgi 解压 二.配置环境变量 1 2.path mvn -version 三.本地仓库 本地仓库用来存放远程下载的包,默 ...
- CF A.Mishka and Contest【双指针/模拟】
[链接]:CF/4892 [题意]: 一个人解决n个问题,这个问题的值比k小, 每次只能解决最左边的或者最右边的问题 解决了就消失了.问这个人能解决多少个问题. [代码]: #include<b ...
- HDU 2256 Problem of Precision (矩阵快速幂)(推算)
Problem of Precision Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- POJ2032 Building a Space Station(Kruskal)(并查集)
Building a Space Station Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7469 Accepte ...
- java中Frame Jpanel等中间显示
几种是窗口中间显示的方法: 1.Frame int windowWidth = frame.getWidth(); //获得窗口宽 int windowHeight = frame.getHeight ...
- [CTSC2017]最长上升自序列(伪题解)(Dilworth's theorem+网络流)
部分分做法很多,但每想出来一个也就多5-10分.正解还不会,下面是各种部分分做法: Subtask 1:k=1 LCS长度最长为1,也就是说不存在j>i和a[j]>a[i]同时成立.显然就 ...
- priority_queue的运算符重载问题
对于需要比较的函数或STL(最常见的为sort,priority_queue) 要对自创的结构进行运算符重载(sort可以写cmp,一样的效果) 1.只能对小于号重载 cmp函数与其起到相同的作用 2 ...
- iOS 多线程之NSOperation篇举例详解
这篇博客是接着总篇iOS GCD NSOperation NSThread等多线程各种举例详解写的一个支篇.总篇也包含了此文的链接.本文讲解的知识点有NSBlockOperationClick,队列, ...