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的. 责任链模式: 通过使多个对象都有 ...
随机推荐
- docker从零开始 存储(二)volumes 挂载
使用volumes 卷是保存Docker容器生成和使用的数据的首选机制.mount binds依赖于主机的目录结构,而卷完全由Docker管理.卷绑定安装有几个优点: 与绑定装入相比,卷更易于备份或迁 ...
- Docker Ubuntu容器安装ping(zz)
更新apt-get的软件包信息,然后再安装 sudo docker run ubuntu apt-get update sudo docker run ubuntu apt-get install i ...
- CSS3实现鼠标经过图片时图片放大
在鼠标经过图片时,图片被放大,而且还有个过渡的效果.... <!DOCTYPE html> <html> <head> <link href="cs ...
- vs2012将项目同步到github
http://www.cnblogs.com/SmallZL/p/3637613.html 大神作品,亲测可用
- 主席树+LCA【p2633 (bzoj2588】 Count on a tree
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
- dutacm.club Water Problem(矩阵快速幂)
Water Problem Time Limit:3000/1000 MS (Java/Others) Memory Limit:163840/131072 KB (Java/Others)Tot ...
- Xamarin XAML语言教程基本视图ContentView
Xamarin XAML语言教程基本视图ContentView 基本视图ContentView 视图是用来呈现具体内容,根据呈现内容不同,使用的视图也不同.其中,最常用的视图为ContentView视 ...
- POJ 3494 Largest Submatrix of All 1’s(最大子图形)
[题目链接] http://poj.org/problem?id=3494 [题目大意] 在01矩阵中求最大全1子矩形 [题解] 在处理每个点的时候,继承上一个点等高度下的左右最大扩展, 计算在该层的 ...
- 开启关闭Centos的自动更新(转)
开启关闭Centos的自动更新 关闭Centos的自动更新,操作记录如下: [root@jwbdb alpha]# chkconfig –list yum-updatesd yum-updatesd ...
- 使用Python的turtle模块画出最简单的五角星
代码如下: import turtle def main(): t = turtle.Turtle() t.hideturtle() lengthOfSize = 200 drawFivePointS ...