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责任链设计模式

java责任链设计模式_Java中的责任链设计模式相关推荐

  1. java 职责链模式_Java中的责任链模式

    java 职责链模式 当应有几个处理器来执行某项操作并为这些处理器定义特定顺序时,就需要采用责任链设计模式. 在运行时处理器顺序的可变性也很重要.模式的UML表示如下: 处理程序定义处理器对象的一般结 ...

  2. java后台常用设计模式_Java中几个常用设计模式

    1.单例模式(有的书上说叫单态模式其实都一样) 该模式主要目的是使内存中保持1个对象.看下面的例子: package org.sp.singleton; //方法一 public class Sing ...

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

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

  4. java 模板方法设计模式_Java中的模板方法设计模式

    java 模板方法设计模式 模板方法是一种行为设计模式 ,用于创建方法存根并将某些实现步骤推迟到子类. 模板方法定义了执行算法的步骤,它可以提供默认实现,该实现对于所有或某些子类可能是通用的. 让我们 ...

  5. java 生成器 设计模式_Java中的生成器设计模式

    java 生成器 设计模式 Java 中的 Builder设计模式是一种创建模式,即用于创建对象,类似于 工厂方法设计模式 ,这也是创建设计模式. 在学习任何设计模式之前,我建议先找出特定设计模式要解 ...

  6. java工厂模式和抽象工厂_Java中的抽象工厂设计模式

    java工厂模式和抽象工厂 Welcome to Abstract Factory Design Pattern in java example. Abstract Factory design pa ...

  7. java证书存放位置_Java中的证书路径发现

    我尝试通过Java内置功能为此(HttpURLConnection)建立一个https连接.但是我得到这个异常: javax.net.ssl.SSLHandshakeException: sun.se ...

  8. java可以多重继承吗_Java中的多重继承与组合vs继承

    java可以多重继承吗 有时我写了几篇有关Java继承,接口和组成的文章. 在这篇文章中,我们将研究多重继承,然后了解组成优于继承的好处. Java中的多重继承 多重继承是创建具有多个超类的单个类的能 ...

  9. java中有没有栈_Java中堆和栈有什么区别

    stack 和 heep 都是内存的一部分stack 空间小,速度比较快, 用来放对象的引用heep 大,一般所有创建的对象都放在这里.栈(stack):是一个先进后出的数据结构,通常用于保存方法(函 ...

最新文章

  1. Dubbo 和 HSF 在阿里的实践:携手走向下一代云原生微服务
  2. azure devops中文显示乱码_【Azure DevOps系列】Azure DevOps生成代码覆盖率
  3. python恶搞表情包-哈哈!我用 Python 把你的朋友变成表情包了
  4. 【arduino】arduino代码运行时间测试函数,代码性能运行时间测试方法
  5. thinkphp session mysql_ThinkPHP实现将SESSION存入MYSQL的方法
  6. lin通信ldf文件解析_lin ldf
  7. Spring : 依赖注入(IoC)控制反转
  8. Python 爬取 B 站数据分析,宋智孝李光洙谁最受中国粉丝喜爱
  9. Spark API 之 cogroup 使用
  10. [照片]51cto众生相
  11. Win7下如何破解Visual Studio2008 90天试用版
  12. Visual Studio 2017正式发布
  13. win10系统开启扫描仪服务器,Win10系统下如何使用扫描仪|win10系统中扫描仪的使用方法...
  14. setupfactory安装程序设置开机自启动
  15. java 读取txt乱码问题_Java读取txt文档乱码解决方法
  16. wxid转扫一扫协议加好友
  17. 计算机基础和Linux安装
  18. 帝国PHP二次开发,帝国CMS二次开发有哪些注意事项
  19. python拟合线性函数_Python线性拟合实现函数与用法示例
  20. vue-composition-api.mjs:1:7: ERROR: No matching export in “node_modules/vue/dist/vue.runtime.esm-bun

热门文章

  1. Acwing 232. 守卫者的挑战
  2. YbtOJ#20073-[NOIP2020模拟赛B组Day6]钻石守卫【构造】
  3. jzoj4223-旅游【并查集】
  4. C. Minimum Grid Path(思维)
  5. 【dfs】树上游戏(P2664)
  6. 2017西安交大ACM小学期数论 [更新学号]
  7. Spring MVC的GET与POST请求url-pattern坑
  8. 这些排序算法的使用时机,你都知道吗?
  9. Java命令学习系列(三)——Jmap
  10. Spring的核心模块解析