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从零开始(四)集群初体验,docker-machine swarm
介绍 在第三节中,选择了第二节中编写的应用程序,并通过将其转换为服务来定义它应如何在生产中运行,并生成五个应用实例 在本节中,将此应用程序部署到群集上,在多台计算机上运行它.多容器,多机应用程序通过连 ...
- [图解算法] 归并排序MergeSort——<递归与分治策略>
#include"iostream.h" void Merge(int c[],int d[],int l,int m,int r){ ,k=l; while((i<=m)& ...
- centos7.2使用yum安装MariaDB10.1
①添加MariaDB的yum源 1.创建MariaDB.repo sudo vi /etc/yum.repos.d/Mariadb.repo 2.将以下文件中的字段添加到MariaDB.repo文件中 ...
- ubuntu 18.04下安装编译的KMS,依赖库
libboost-system1.65.1 libglib2.0-0 libgstreamer-plugins-base1.0-0 libgstreamer1.0-0 libnice10 libsig ...
- (3)python 列表和元组
列表 元组 字段 等都是一种数据结构.其中列表和元组比较相似都是顺序保存的,都可以通过索引来找到元素. 列表和元组的主要区别:列表是可以修改的,元组不可以修改.列表用[]表示,元组用()表示 一.列表 ...
- F - Oil Deposits 【地图型BFS+联通性】
The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSu ...
- Codeforces 1038E Maximum Matching
可能写了个假算法 假设定义:含有一个欧拉路的图为类欧拉图 欧拉路的定义:一个无向连通图中,存在一条路径对所有边都遍历且仅遍历一次:判断方法:该连通图中度为奇数的点的个数不能超过2,即为0或者2 题目解 ...
- SHELL 在指定行的前/后插入指定内容
#如果知道行号可以用下面的方法 sed -i '88 r b.file' a.file #在a.txt的第88行插入文件b.txt awk '1;NR==88{system("cat ...
- [BZOJ4772]显而易见的数论(数论)
4772: 显而易见的数论 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 76 Solved: 32[Submit][Status][Discuss ...
- 【模拟】bzoj2295 【POJ Challenge】我爱你啊
#include<cstdio> #include<cstring> using namespace std; int n; char s[100001],table[]=&q ...