java责任链设计模式_Java中的责任链设计模式

java责任链设计模式

在本教程中,我们将学习如何在Java中实现责任链模式。

责任链设计模式涉及到拥有一系列负责处理请求的对象链。 当客户端发送请求时,第一个处理程序将尝试处理该请求。 如果可以处理,则请求处理在此结束。 但是,如果处理程序无法处理用户请求,则它将转到链中的下一个处理程序。 该过程将继续进行,直到链中的任何一个处理程序成功处理请求或链结束为止。 如果整个链条都无法处理该请求,则意味着该请求仍然无法满足。

为什么要使用责任链?

责任链是我们软件行业中非常重要的设计模式。 它具有以下优点:

  • 由于用户不需要关心哪个对象将处理其请求,因此它促进了用户与系统之间的松散耦合。
  • Java异常处理机制也利用了这种模式。 如果找不到合适的catch块,则将请求委托给调用方方法进行处理,直到找到合适的处理程序为止
  • 通过让请求通过一系列过滤器,该模式还可以找到其在过滤用户请求中的应用

UML表示形式:

责任链模式的UML表示类似于:

在这里,我们具有以下类型的对象:

  • 客户:发出用户请求的代码
  • 处理程序: 抽象超类或定义请求处理程序方法的接口
  • ConcreteHandler: Handler的实现类

处理程序对象在链中从一个连接到另一个。 另外, 每个具体处理程序都以其自己独特的方式处理请求。

定义抽象处理程序:

让我们使用责任链实现请求过滤逻辑。

首先,我们将定义一个抽象的RequestFilter类:

 public abstract class RequestFilter {     private RequestFilter next;  public RequestFilter(RequestFilter next) { this .next = next; }  public boolean doFilter(HttpServletRequest request);     public void getNext() { return this .next; } .next; }  } 

定义具体处理程序:

现在,让我们定义链中的第一个过滤器类,它将阻止来自可疑IP地址的请求:

 public class SuspiciousRequestFilter extends RequestFilter {     public SuspiciousRequestFilter(RequestFilter next) { super (next); }   public boolean doFilter(HttpServletRequest request) { if (hasMaliciousIntent(request.getRemoteAddr()) { //blocks the request return false ; } else if (next == null ) { //filter chain ended return false ; } return this .getNext().doFilter(request); }  public boolean hasMaliciousIntent(String ipAddress) {  ... }  } 

同样,让我们​​定义链中的第二个过滤器,它将阻止未授权的请求:

 public class UnauthorizedRequestFilter extends RequestFilter {     public UnauthorizedRequestFilter(RequestFilter next) { super (next); }   public boolean doFilter(HttpServletRequest request) { if (isUserUnauthorized(request)) { //blocks the request return false ; } else if (next == null ) { //filter chain ended return false ; } return this .getNext().doFilter(request); }  public boolean isUserUnauthorized(HttpServletRequest request) {  ... }  } 

最后一个过滤器将识别和阻止尝试登录次数超出的用户:

 public class ExceededLoginAttemptsRequestFilter extends RequestFilter {     public ExceededLoginAttemptsRequestFilter(RequestFilter next) { super (next); }   public boolean doFilter(HttpServletRequest request) { if (hasExceededLoginAttempts(request)) { //blocks the request return false ; } else if (next == null ) { //filter chain ended return false ; } return this .getNext().doFilter(request); }  public boolean hasExceededLoginAttempts(HttpServletRequest request) {  ... }  } 

调用链:

最后,是时候将它们编织成链了:

 HttpServletRequest httpServletRequest = ...   //the last filter in our chain  RequestFilter exceededAttemptsFilter = new ExceededLoginAttemptsRequestFilter( null );   RequestFilter unauthorizedFilter = new UnauthorizedRequestFilter(exceededAttemptsFilter);  RequestFilter suspiciousActivityFilter = new SuspiciousRequestFilter(unauthorizedFilter);   suspiciousActivityFilter.doFilter(httpServletRequest); 

在这里,每个用户请求将遵循以下过滤链:

这些过滤器标准之一一旦匹配,匹配的过滤器就会过滤掉该用户请求。 这也意味着剩余的链将被跳过。

结论:

在本教程中,我们学习了如何以及何时使用责任链设计模式。

翻译自: https://www.javacodegeeks.com/2019/09/chain-of-responsibility-design-pattern-in-java.html

java责任链设计模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机加工程序工时程序_团宠来袭 | 针对多品种小批量的机加工柔性生产解决方案...

“天下之至柔,驰骋天下之至坚。无有入于无间,吾是以知无为之有益。”老子指出,世间最柔弱的东西里面往往蓄着人们看不见的巨大力量,使得最坚强的东西也无法抵挡。就像水是最柔的东西,但却能穿透山地。柔性的力量不容小…

静态方法+工厂方法(静态方法用途)

【0】README 0.1) 本文描述源代码均 转自 core java volume 1, 旨在了解 “静态方法”; 【1】静态方法相关 1.1)静态方法是一种不能向对象实施操作的方法; 如,Math.pow(x, a), 在运算时&#…

一致吗 驱动_iPhone 12无线充电真的香吗?

2020年10月14日凌晨1点,苹果发布会又来了,开场就是苹果CEO库克在总部贾伯斯剧院闪亮登场!没错!各位果粉心心念念的 iPhone 12 它走来了!如之前爆料所言,本次发布会共推出了4款机型:iPhone 12 mi…

spring boot注释_Spring Boot中的@SpringBootConfiguration注释

spring boot注释Spring Boot中的 SpringBootConfiguration注释是一个类级别的注释,它指示此类提供了应用程序配置。 通常,具有main()方法的类最适合此注释。 我们通常使用SpringBootApplication批注,该批注会自动继承…

selenium自动化测试_Selenium测试可实现有效的测试自动化

selenium自动化测试尽管移动应用程序的市场份额有大幅增长,但网络应用程序仍然具有大量的用户基础。 在部署之前,企业正在关注Web应用程序的质量。 这是测试发挥重要作用的地方。 与某些可以自动化的功能测试不同,UI测试仍然大部分是手动过程…

画时序图 visual_时序图的初步了解

1、划清边界,识别交互的语境所谓划清边界,就是要界定好自己所要画的时序图的范围,“学生在教务系统中查询其课程的成绩”就是所要绘制的时序图的交互内容,不用往上延伸到用户登录,也不要往下延伸到下载成绩单。识别交互…

java 初始化块

【0】README 0.1) 本文描述源代码均 转自 core java volume 1, 旨在分享初始化块 or 静态初始化块的调用过程; 【1】初始化块相关 1.1)前面讲过了 两种初始化数据域的方法: 在构造器中设置值 在声明中赋值&#xff…

简短介绍_中秋节的来历由来简短20字30字 中秋节的起源50字100字简介

中秋节是我国的传统佳节。按照史籍的记实,“中秋”一词最早呈此刻《周礼》一书中。小编整理了中秋节来历的简单介绍,既有二三十字的简要版,也有100字左右的介绍,让我们一起了解中秋节的起源吧。中秋节的来历由来简短20字中秋节起源…

java中的lombok_如何在Java中使用Lombok删除样板设置器吸气剂

java中的lombok你好朋友, 一次又一次反对Java的观点之一是,我们必须写很多样板 我们简单的POJO类的setter和getter形式的代码,不必要地增加了 我们代码的长度。 为了解决这个问题,有一个名为Project Lombok的开源项目可以解决这…

super 和 this 关键字的比较+调用构造器(this)+动态绑定

【0】README 0.1) 本文描述源代码均 转自 core java volume 1, 旨在加深对 super 和 this关键字 的用法比较; 0.2) 最后还补充了 多态和动态绑定 的定义 以及对动态绑定进行了详细分析,这两个定义给的非常棒&#xf…

修改表格字体颜色_word排版应用:如何创建文本样式和表格样式

样式,大家应该不陌生,在Word中是一个非常强大的功能,运用得好,可以节省很多时间和精力。但如果你不会用,关键时刻可以把你急哭了!在前面的“Word样式,简单又实用!”和“Word样式也有…

java流式传输对象_Java性能:面向教学与流式传输

java流式传输对象在for循环中向上或向下计数是最有效的迭代方式吗? 有时答案既不可行。 阅读这篇文章,了解不同迭代品种的影响。 迭代性能 关于如何以高性能进行迭代有很多观点。 Java中的传统迭代方式是一个for循环,该循环从零开始&#xf…

vue框架项目部署到服务器_在浏览器中在线尝试无服务器框架项目!

vue框架项目部署到服务器无服务器框架是无服务器工具的一致领导者。 但是,没有简单的方法可以在线试用无服务器框架项目。 您确实需要一个体面的开发人员设置,并且需要一些工作来设置sls , npm等。 确切地说,您确实做到了 –直到…

用python连接数据库_用Python连接MySQL

MySQL是当下最流行的关系型数据库管理系统之一,在用Python爬取网络数据的过程中也经常需要用到MySQL,Python中pymysql库提供了连接MySQL的接口,为Python连接和操作MySQL提供了便利.一,安装pymysql库直接使用pip工具进行安装:pip install pymysql二,连接mysql首先导入第三方库,然…

树的预备知识

【0】README 0.1) 本文总结于 数据结构与算法分析,旨在整理出 树的相关术语和概念(哥子始终记不住树的高度和深度,记着记着就混淆了,哎,所以分享出来); 【1】树相关 1.1&#xff…

arduino蓝牙通讯代码_蓝牙4.0模块 无线数据传输模块 无线蓝牙串口 Arduino

产品介绍:蓝牙4.0模块是专为智能无线数据传输而打造的。该模块遵循BT2.1EDR/3.0/4.0(BLE)蓝牙规范,支持SPP 蓝牙串口协议等。本模块集成了MCU 和蓝牙芯片,支持UART、SPI、I2C、I2S 等接口,包含4 个PWM 端口和6 个12bit ADC 通道&a…

后台审核管理 ergo_Kogito,ergo规则—第2部分:规则的全面执行模型

后台审核管理 ergo这是第二后 一系列更新的Kogito主动性和我们的努力,使Drools的云。 在本文中,我们将深入研究规则单元的详细信息,并向您展示为什么我们对它们感到兴奋。 规则的全包执行模型 如果您一直在仔细检查Drools手册,以…

不相交集ADT(联机算法 + 脱机算法)

【0】README 0.1)本文总结于 数据结构与算法分析, 旨在分享 不相交集ADT的相关概念; 0.2) 不相交集ADT 的知识涉及到: 等价关系、动态等价关系、不相交集ADT相关操作及其数据结构 ,还有我们最后分享的 不…

win7无法连接打印机拒绝访问_Win7系统”windows无法连接到打印机拒绝访问“怎么办?通过创建local port端口连接来搞定...

随着电脑的使用率越来越高,我们有时候可能会遇到Win7系统”windows无法连接到打印机拒绝访问“的问题,要怎么处理呢?详细解决方法如下:故障现象:按照XP的方式添加打印机,总是会出现“windows无法连接到打印…

spring boot测试_测试Spring Boot有条件的合理方式

spring boot测试如果您或多或少有经验的Spring Boot用户,那么很幸运,在某些时候您可能需要遇到必须有条件地注入特定bean或配置的情况 。 它的机制是很好理解的 ,但有时这样的测试条件下(以及它们的组合)可能会导致混乱…