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

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

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

相关文章

硒测试可实现有效的测试自动化

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

C++ map用法总结(整理)

1,map简介 map是STL的一个关联容器,它提供一对一的hash。 第一个可以称为关键字(key),每个关键字只能在map中出现一次;第二个可能称为该关键字的值(value); map以模板(泛型)方式实现,可以存储任意类型的…

带有Spring Cloud Config和JHipster的Java微服务

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 如今,使用Java和Spring Boot开发微服务架构非常流行。 它绝对是Java生态系统中最…

如何在Java中使用Lombok删除样板安装程序获取器

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

Dev-C++使用技巧1(亲测)(超详细)(安装过程、修改语言、新建项目、配置C++ 11、开启警告信息和调试信息)

前言 Dev-C是一款内存占用小,支持C/C,支持调试,可以一键编译、运行的IDE(集成开发环境)。 下载链接:Dev-C - Download 如果上面那个不行或者下载比较慢,可以点链接: Dev-Cpp 提取码: xaby 。 …

从网络虚拟化,看智能网卡发展史

5G的到来无疑将加速网络虚拟化的进程,在电信领域,网络虚拟化不仅在核心网,也在网络的边缘。但是,仅仅通过软件解决方案不能提供足够的网络可靠性和服务质量,而具有高级可编程功能智能网卡(Smart NIC&#x…

Dev-C++使用技巧2(亲测)(更改字体和颜色、自动保存、快捷键选项、一键排版)

更改字体和颜色 顶部菜单栏->工具->编辑器选项。 更改字体 当前选项卡->显示,字体word有的基本都有,华文楷体、宋体,幼圆之类。西文字体默认字体Consloas就不错,中文的话幼圆、新宋体都挺不错。 幼圆效果&#xff1…

深入浅出全面解析RDMA

RDMA(RemoteDirect Memory Access)技术全称远程直接内存访问,就是为了解决网络传输中客户端与服务器端数据处理的延迟而产生的。它将数据直接从一台计算机的内存传输到另一台计算机,无需双方操作系统的介入。这允许高吞吐、低延迟的网络通信,…

hypervisor介绍

hypervisor:一种运行在物理服务器和操作系统之间的中间层软件,可以允许多个操作系统和应用共享一套基础物理硬件。可以将hypervisor看做是虚拟环境中的“元”操作系统,可以协调访问服务器上的所有物理设备和虚拟机,所以又称为虚拟…

Selenium WebDriver中的TestNG侦听器及示例

Java提供了不同的接口,使您可以修改TestNG行为。 这些接口在Selenium WebDriver中进一步称为TestNG侦听器。 TestNG Listeners还允许您根据项目要求自定义测试日志或报告。 Selenium WebDriver中的TestNG侦听器是侦听某些事件并跟踪测试执行情况的模块,…

Ubantu键盘快捷键

Ubuntu系统 长按"Win"键可打开快捷键提示界面

win10安装python详细过程

关于python的安装 一切语言皆为工具接下来咱们就开始吧一切语言皆为工具 既然你决定安装它,那就已经告知自己要掌握这门工具, 但是有一定你一定要铭记于心那就是: python 是个工具时刻想着如何用它解决你的问题【哪怕是一个简单的想法】 接…

第18次csp认证 201912-1 报数(C++)

题目 分析 需要跳过的包括:7的倍数和包括7的数。跳过的同时n要加一(总的报n个数,跳过的不算)。声明一个全局数组count[4]方法1:i1开始到n,把输入的i转化为字符串,然后在字符串里找’7’或者7的…

C++ vector求均值和方差

1 定义 &#xff08;1&#xff09;均值 &#xff08;2&#xff09;方差 &#xff08;3&#xff09;标准差 2 代码实现 //std::vector< double> 或者 std::vector< int> 类型变量求均值和方差 #include <numeric> #include <iostream> #include <m…

第18次csp认证 201912-2 回收站选址(C++)

题目 分析 每一个垃圾堆放处都可能是回收站&#xff0c;所以两轮循环&#xff0c;找出所有可以成为回收站的坐标。再两轮循环&#xff0c;确定所有回收站的得分最后输出每种得分的回收站个数 AC代码 #include <iostream> #include<string> using namespace std;…

Python——列表中存放字典遇到的问题

Python——列表中存放字典遇到的问题 使用列表、字典之间的相互嵌套可以很容易的实现json数据格式&#xff0c;但是昨天在往列表中装入字典时遇到了问题&#xff1a; 直接使用append方法将字典添加到列表中&#xff0c;如果需要更改字典中的数据&#xff0c;那么列表中的内容也…

pat 乙级 1036 跟奥巴马一起编程(C++)

题目 美国总统奥巴马不仅呼吁所有人都学习编程&#xff0c;甚至以身作则编写代码&#xff0c;成为美国历史上首位编写计算机代码的总统。2014 年底&#xff0c;为庆祝“计算机科学教育周”正式启动&#xff0c;奥巴马编写了很简单的计算机代码&#xff1a;在屏幕上画一个正方形…

Sublime删除所有包含特定值的行

1、选中包含的字符 2、全部选中包含这个字符&#xff1a; ALTF3 3、全选整行&#xff1a; 台式机&#xff1a;Shiftend 笔记本&#xff1a;ShiftFnend 4、删除所有数据&#xff1a; DELETE 5、删除所有空白行&#xff1a; 使用快捷方式直接删除空行&#xff0c;前提是进行如下…

Excel完成将多行多列数据转化为一列

想要把Excel的数据用Word转成一行。那么第一步当然是将excel中的数据先复制下啦&#xff0c;复制好了之后打开word&#xff0c;然后进行粘贴&#xff0c;注意这里要选择“只保留文本”哦。 接下来我们要用鼠标选中每一行的两个数据中间保留的空格&#xff0c;就像小编这样哦…

Kogito,ergo规则—第2部分:规则的全面执行模型

这是第二后 一系列更新的Kogito主动性和我们的努力&#xff0c;使Drools的云。 在这篇文章中&#xff0c;我们将深入研究规则单元的细节&#xff0c;并向您展示为什么我们对它们感到兴奋。 规则的全包执行模型 如果您一直在仔细检查Drools手册&#xff0c;以在每个最新发行版中…