走穿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责任链模式详解相关推荐

  1. 走穿java23种设计模式--18中介者模式详解

    走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...

  2. 设计模式(9)-责任链模式详解(易懂)

    责任链模式的定义 责任链模式是一种设计模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...

  3. 23种设计模式之——责任链模式(okhttp 拦截器)

    前言 网络七层协议 在现实中的责任链模型之一就是网络连接.对与程序猿而言,七层或五层的网络连接模型是肯定知道的. 当一个网络请求发出时,需要经过应用层->传输层->网络层->连接层- ...

  4. 精讲23种设计模式-基于责任链模式~构建企业级风控系统

    文章目录 一.责任链 1. 责任链基本概念 2. 定义 3. 关键要点 4. 责任链模式优缺点 5. 责任链模式类结构图 6. 网关权限控制责任链模式 二.构建企业级风控系统 2.1. 定义公共抽象任 ...

  5. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之责任链模式

    · 责任链模式在王者荣耀中的应用 · 一.简述 在王者荣耀商城中,玩家可以参与夺宝抽奖.夺宝抽奖分两种,一种是积分抽奖,另一种是钻石抽奖:在平常,两种夺宝抽奖方式均可以通过60钻石/积分抽奖一次,或者 ...

  6. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍 为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求, ...

  7. 23种设计模式之责任链模式

    责任链模式的定义 定义: 使多个对象都有机会处理请求, 从而避免了请求的发送者和接受者之间的耦合关系. 将这些对象连成一条链, 并沿着这条链传递该请求,直到有对象处理它为止 通俗的讲, 就是将对请求的 ...

  8. java设计模式---责任链模式详解

    深入理解什么是责任链模式 一,责任链模式 1,什么是责任链模式 二,框架中使用到的责任链模式 1,springmvc流程 2,mybatis的执行流程 3,spring的过滤器和拦截器 4,senti ...

  9. java责任链模式_java中责任链模式详解和使用方法

    顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为 ...

最新文章

  1. Oracle Study--RAW Device在Oracle下的应用
  2. stl string的erase方法
  3. uWSGI + Nginx + Django 部署
  4. hadoop put命令的格式_HDFS常用命令
  5. H5项目常见问题汇总及解决方案
  6. 吝啬的国度(dfs)
  7. 【2018.06.21学习笔记】【linux高级知识 14.1-14.3】
  8. 大企业都在用的开源 ForgeRock OpenAM 被曝预认证 RCE 0day
  9. Bailian4104 单词翻转(POJ NOI0107-27)【堆栈+字符流】
  10. Python学习笔记之 高级变量类型 列表,元组,字典,字符串的相关常用 操作
  11. Struts2拦截器-MethodFilterInterceptor
  12. Maven打包:Error injecting:xxxxxxx / java.lang.NoClassDefFoundError: xxxxxx
  13. html设置字体为雅黑,html怎么设置字体为宋体 html怎么设置字体为微软雅黑?
  14. Flutter防微信还原度最高开发日志
  15. 工作中遇到的小技巧 一(暂停更新)
  16. 判断手机音量大小,做出提醒
  17. 微信小程序开发分析总结
  18. redis工具redis Desktop Manager使用
  19. visio2016安装包中文专业版下载及安装教程
  20. 潘粤明、富而喜悦齐预测卡塔尔世界杯巴西必夺冠走红网络!

热门文章

  1. KUKA 正运动学计算
  2. android 背景色阴影,Android 阴影背景的四种实现方式
  3. 【链表】双向循环链表的实现
  4. Win10操作系统无法调整亮度
  5. 区分概率中的事件关系
  6. 串操作指令详解 MOVS,LODS,STOS,CMPS,SCAS,REP
  7. python模拟乘客进站流程
  8. 秒速五厘米——我们究竟都在等待什么样的爱情
  9. 羽毛球馆网上租赁系统的设计与实现
  10. DCHP详细工作流程及分析