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的. 责任链模式: 通过使多个对象都有 ...
随机推荐
- require.js模块化管理和加载js(按需加载)简单实例教学
一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代 ...
- Selenium2+python自动化23-富文本(自动发帖)【转载】
前言 富文本编辑框是做web自动化最常见的场景,有很多小伙伴遇到了不知道无从下手,本篇以博客园的编辑器为例,解决如何定位富文本,输入文本内容 一.加载配置 1.打开博客园写随笔,首先需要登录,这里为了 ...
- spring applicationContext.xml 中bean配置
如果采用set get方法配置bean,bean需要有set get 方法需要有无参构造函数,spring 在生成对象时候会调用get和set方法还有无参构造函数 如果采用constructor方法则 ...
- Python 解释器中方向键无法使用的解决方法
如下: SyntaxError: invalid syntax >>> ^[[A File "<stdin>", line 1 ^ SyntaxErr ...
- 将win平台上的mysql数据复制到linux上报错Can't write; duplicate key in table
将win平台上的mysql数据复制到linux上报错Can't write; duplicate key in table xxx 新年新气象,果然在新年的第一天就遇到了一个大坑,项目在win上跑的没 ...
- 《javascript高级程序设计》读书小延伸
这本书已经读了几章了,想着试试能不能做出点东西,就简单的练了把手.觉得对于初学者,自己试着练练,效果还不错的. 挥刀要从轻的开始,起初的原因是和同事谈起曾经的逝水年华(小时候干的坏事)时说起了曾经的一 ...
- ng2-admin安装问题
问题一 启动项目出现如下error: 原理: 暂不清晰, 目前认为是项目本身的问题. 项目作者在博文中给出了相应的解决方案. 具体解决方案: 如果之前装过angular-cli需要先卸载:npm un ...
- 回溯法练习【BFS/DFS】
1.N皇后问题 2.油田问题 3.素数环问题 4.马踏棋盘问题 5.图的m着色问题 6.01背包问题 7.TSP问题 [Code-1:输出N皇后方案和个数] #include<bits/stdc ...
- POJ 2492 A Bug's Life【并查集高级应用+类似食物链】
Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes ...
- [BZOJ3816][清华集训2014]矩阵变换(稳定婚姻问题)
3816: 矩阵变换 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 803 Solved: 578[Submit][Status][Discuss] ...