走穿java23种设计模式-15责任链模式详解
走穿java23种设计模式-15责任链模式详解
责任链模式是一种常见的行为模式。
一.责任链模式的现实场景
习伟过生日邀请了很多朋友到KTV一起庆祝,为了增加欢乐的气氛,习伟建议大家一起玩击鼓传花的游戏。由习伟击鼓,大家依次往下传花,鼓声停下来时,花在谁手上就要喝酒并且还要唱一首歌。
大家都很踊跃地参加这个游戏,聚会的气氛很快热闹起来,习伟也度过了一个很快乐的生日聚会。
在上面的这个场景中,击鼓传花的这个游戏过程类似于设计模式中的责任链模式,就是要事件不断的进行传递,直到事件被执行为止。
二.责任链模式(Chain of Respinsibility Pattern)的定义
使多个对象都有处理请求的机会,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象串成一条链,并沿着这条链依次传递请求,直到有对象处理它为止。
三.责任链模式的类图
这里类图中看起来是抽象类直接调用自己,但是实际是他的子类具体处理者调用下一个具体具体处理者。
四.责任链模式的两个角色
1.抽象处理者(Handler)角色
该角色对请求进行抽象,并定义一个方法来设定和返回对下一个处理者的引用。
2.具体处理者(Concrte Handler)角色
该角色接到请求后,可以选择将请求处理掉,或者将请求传递给下一个处理者。
由于具体处理者持有对下一个处理者的引用,因此,如果需要,具体处理者可以访问下一个处理者,把问题給下一个处理者,并以此类推。
五.责任链模式的优缺点
责任链模式中的优点
1. 责任链模式将请求和处理分开,请求者不知道是谁处理,处理者可以不用知道请求者全貌。
2. 提高系统的灵活性
命令模式的缺点
1.降低程序的性能。每个请求都是从链头遍历到链尾,当遇到链比较长的时候,性能就会大幅下降。
2.不易于调试,由于该模式采用了类似递归的方式,调试的时候逻辑比较复杂。
责任链中的节点数量需要控制,避免出现超长链的情况,这就需要设置一个最大的节点数量,一旦超过则不允许增加节点,避免责任链无意识地破化系统性能。
六.责任链模式的使用场景
责任链模式是一种常见的模式,Struts2的核心控件FilterDispatcher是一个Servlet过滤器,该控件就是采用责任链模式,可以对用户请求进行层层过滤处理。责任链模式在实际项目中的使用也是有的,其典型的应用场景如下:
1.一个请求需要一系列的处理工作。
2.业务流的处理,例如文件审批。
3.对系统进行扩展。
七.责任链模式的示例
这里使用上面的现实常见做代码示例。
示例的类图
方法的作用看代码。。。
示例的代码
抽象处理类Player
package p15_ChainOfRespinsibility;/*** 抽象处理者*/
public abstract class Player {//具体的传花人private Player successor;//传入下一个具体的传花人protected void setSuccessor(Player successor){this.successor=successor;}//传递的过程public abstract void handle(int i);//传递給下一个public void next(int index){if (successor!=null) {successor.handle(index);}else {System.out.println("游戏结束!");}}}
具体处理类PlayerA
package p15_ChainOfRespinsibility;/*** 具体处理者,传花人*/
public class PlayerA extends Player {//构造方法,传入下一个传花人public PlayerA(Player successor) {this.setSuccessor(successor);}//传花的过程@Overridepublic void handle(int i) {if (i==1){System.out.println("PlayerA 喝酒!");}else {System.out.println("PlayerA 向下传花!");next(i);}}
}
具体处理类PlayerB
package p15_ChainOfRespinsibility;/*** 具体处理者,传花人*/
public class PlayerB extends Player {//构造方法,传入下一个传花人public PlayerB(Player successor) {this.setSuccessor(successor);}//传花的过程@Overridepublic void handle(int i) {if (i==2){System.out.println("PlayerB 喝酒!");}else {System.out.println("PlayerB 向下传花!");next(i);}}
}
具体处理类PlayerC
package p15_ChainOfRespinsibility;/*** 具体处理者,传花人*/
public class PlayerC extends Player {//构造方法,传入下一个传花人public PlayerC(Player successor) {this.setSuccessor(successor);}//传花的过程@Overridepublic void handle(int i) {if (i==3){System.out.println("PlayerC 喝酒!");}else {System.out.println("PlayerC 向下传花!");next(i);}}
}
具体处理类PlayerD
package p15_ChainOfRespinsibility;/*** 具体处理者,传花人*/
public class PlayerD extends Player {//构造方法,传入下一个传花人public PlayerD(Player successor) {this.setSuccessor(successor);}//传花的过程@Overridepublic void handle(int i) {if (i==4){System.out.println("PlayerD 喝酒!");}else {System.out.println("PlayerD 向下传花!");next(i);}}
}
上面PlayerABCD类都是类似的,只是传花过程,对自己的判断不一样。
事件类,测试类DrumBeater
package p15_ChainOfRespinsibility;/*** 击鼓者*测试类*/
public class DrumBeater {public static void main(String args[]){//创建一个链PlayerD playerD=new PlayerD(null);PlayerC playerC=new PlayerC(playerD);PlayerB playerB=new PlayerB(playerC);PlayerA playerA=new PlayerA(playerB);//击鼓三次下停下来playerA.handle(3);}
}
程序运行结果;
这里击鼓3下就是C喝酒,如果击鼓4下就是D喝酒,如果击鼓五下,没有人要喝酒,游戏结束。
但是实际生活的传花游戏,一般会循环开始,也就是D会继续传给A,这里把把i==换成i%4==就可以了。
但是责任链模式基本是没有把事件再重新让所有处理者再处理的。。。
命令模式模式就为大家介绍到这里。
大家如果对其他设计模式有兴趣可以看看我之前的博客:
14命令模式:http://blog.csdn.net/wenzhi20102321/article/details/79323404
13模板方法模式:http://blog.csdn.net/wenzhi20102321/article/details/79284870
12享元模式:http://blog.csdn.net/wenzhi20102321/article/details/78724677
11外观模式:http://blog.csdn.net/wenzhi20102321/article/details/78639087
10桥梁模式:http://blog.csdn.net/wenzhi20102321/article/details/78566532
9组合模式:http://blog.csdn.net/wenzhi20102321/article/details/78463190
8适配器模式:http://blog.csdn.net/wenzhi20102321/article/details/78389326
7装饰模式:http://blog.csdn.net/wenzhi20102321/article/details/78336273
6代理模式:http://blog.csdn.net/wenzhi20102321/article/details/78209493
创建型模式详解:http://blog.csdn.net/wenzhi20102321/article/details/78175558
5原型模式:http://blog.csdn.net/wenzhi20102321/article/details/78167984
4建造者模式:http://blog.csdn.net/wenzhi20102321/article/details/78163855
3抽象工厂模式:http://blog.csdn.net/wenzhi20102321/article/details/78153437
2工厂方法模式:http://blog.csdn.net/wenzhi20102321/article/details/78129065
可以仔细对比一下工厂方法模式和抽象工厂模式,看看概念,看看类图,看看代码,就会明白了。
1单例模式:http://blog.csdn.net/wenzhi20102321/article/details/77882203
java 23种设计模式介绍:http://blog.csdn.net/wenzhi20102321/article/details/54601909
在这新春佳节之际,祝大家,新年愉快,新年新气象,在新的一年里能实现更多的人生价值。
共勉;当我们发现自己老了,其实并不是年纪大了,而是心不在年轻。
走穿java23种设计模式-15责任链模式详解相关推荐
- 走穿java23种设计模式--18中介者模式详解
走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...
- 设计模式(9)-责任链模式详解(易懂)
责任链模式的定义 责任链模式是一种设计模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...
- 23种设计模式之——责任链模式(okhttp 拦截器)
前言 网络七层协议 在现实中的责任链模型之一就是网络连接.对与程序猿而言,七层或五层的网络连接模型是肯定知道的. 当一个网络请求发出时,需要经过应用层->传输层->网络层->连接层- ...
- 精讲23种设计模式-基于责任链模式~构建企业级风控系统
文章目录 一.责任链 1. 责任链基本概念 2. 定义 3. 关键要点 4. 责任链模式优缺点 5. 责任链模式类结构图 6. 网关权限控制责任链模式 二.构建企业级风控系统 2.1. 定义公共抽象任 ...
- 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之责任链模式
· 责任链模式在王者荣耀中的应用 · 一.简述 在王者荣耀商城中,玩家可以参与夺宝抽奖.夺宝抽奖分两种,一种是积分抽奖,另一种是钻石抽奖:在平常,两种夺宝抽奖方式均可以通过60钻石/积分抽奖一次,或者 ...
- 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)
责任链模式(Chain of Responsibility Pattern) 介绍 为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求, ...
- 23种设计模式之责任链模式
责任链模式的定义 定义: 使多个对象都有机会处理请求, 从而避免了请求的发送者和接受者之间的耦合关系. 将这些对象连成一条链, 并沿着这条链传递该请求,直到有对象处理它为止 通俗的讲, 就是将对请求的 ...
- java设计模式---责任链模式详解
深入理解什么是责任链模式 一,责任链模式 1,什么是责任链模式 二,框架中使用到的责任链模式 1,springmvc流程 2,mybatis的执行流程 3,spring的过滤器和拦截器 4,senti ...
- java责任链模式_java中责任链模式详解和使用方法
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为 ...
最新文章
- Oracle Study--RAW Device在Oracle下的应用
- stl string的erase方法
- uWSGI + Nginx + Django 部署
- hadoop put命令的格式_HDFS常用命令
- H5项目常见问题汇总及解决方案
- 吝啬的国度(dfs)
- 【2018.06.21学习笔记】【linux高级知识 14.1-14.3】
- 大企业都在用的开源 ForgeRock OpenAM 被曝预认证 RCE 0day
- Bailian4104 单词翻转(POJ NOI0107-27)【堆栈+字符流】
- Python学习笔记之 高级变量类型 列表,元组,字典,字符串的相关常用 操作
- Struts2拦截器-MethodFilterInterceptor
- Maven打包:Error injecting:xxxxxxx / java.lang.NoClassDefFoundError: xxxxxx
- html设置字体为雅黑,html怎么设置字体为宋体 html怎么设置字体为微软雅黑?
- Flutter防微信还原度最高开发日志
- 工作中遇到的小技巧 一(暂停更新)
- 判断手机音量大小,做出提醒
- 微信小程序开发分析总结
- redis工具redis Desktop Manager使用
- visio2016安装包中文专业版下载及安装教程
- 潘粤明、富而喜悦齐预测卡塔尔世界杯巴西必夺冠走红网络!