在本教程中,我们将学习如何在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中的责任链设计模式相关推荐

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

    java责任链设计模式 在本教程中,我们将学习如何在Java中实现责任链模式. 责任链设计模式涉及到拥有一系列负责处理请求的对象链. 当客户端发送请求时,第一个处理程序将尝试处理该请求. 如果可以处理 ...

  2. Java中的责任链模式

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

  3. 设计模式示例_责任链设计模式示例

    设计模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...

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

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

  5. java责任链设计模式 订单_Java责任链设计模式实例分析

    本文实例讲述了Java责任链设计模式.分享给大家供大家参考,具体如下: 一 代码 abstract class AbstractHandler { private Handler Handler = ...

  6. 责任链设计模式(过滤器、拦截器)

    责任链设计模式(Chain of Responsibility)的应用有:Java Web中的过滤器链.Struts2中的拦截器栈. 先看一个问题: 给定一个字符串"被就业了:),敏感信息, ...

  7. 行为设计模式 - 责任链设计模式

    行为设计模式 - 责任链设计模式 责任链设计模式是行为设计模式之一. 目录[ 隐藏 ] 1责任链设计模式 1.1 JDK中的责任链模式示例 1.2责任链设计模式实例 1.3责任链设计模式 - 基类和接 ...

  8. 一文弄懂责任链设计模式

    目录 背景 什么是责任链 使用场景 结语 背景 最近,我让团队内一位成员写了一个导入功能.他使用了责任链模式,代码堆的非常多,bug 也多,没有达到我预期的效果. 实际上,针对导入功能,我认为模版方法 ...

  9. 责任链设计模式介绍及实战

    责任链设计模式介绍及实战 1.责任链模式 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和 ...

最新文章

  1. 怎么将计算机网络设置家庭,“windows无法在此计算机上设置家庭组”问题如何解决...
  2. OpenGL mipmap filters贴图过滤的实例
  3. Pixhawk原生固件PX4之串口添加读取传感器实现
  4. 程序运行时堆区和栈区的分配
  5. 关于c# .net爬虫
  6. 用python语言写一个简单的计算器
  7. hdu 1005(规律)
  8. Asp.net 使用weboffice实现Word在线编辑
  9. 晚上睡觉手机放床头对大脑会有伤害吗
  10. 关于圆锥曲线切点弦二级结论的总结与再发现
  11. 数据库系统——数据模型基本概念详解
  12. GStreamer应用开发文档的ogg播放器
  13. 活着的意义--读《此生未完成》有感
  14. 如何爬取猫眼网电影票房数据
  15. 汉医健康:“互联网+医疗健康”让患者更有“医”靠
  16. 色域空间 sRGB Adobe RGB Pro Photo RGB
  17. Could not find resource xxx/xxxx/xxx.xml报错解决
  18. 16丨数据分析基础篇答疑
  19. CommandMethod介绍
  20. IT培训行业揭秘(五)

热门文章

  1. ssl提高组周六模拟赛【2018.9.15】
  2. jzoj2136-(GDKOI2004)汉诺塔【找规律,模拟】
  3. 【暴力】I Liked Matrix!
  4. Redis 常用操作命令,非常详细
  5. Eclipse 4.9 正式发布,支持 Java 11
  6. StringTokenizer的使用
  7. 数据结构(三)之单链表反向查找
  8. 为了金秋那沉甸甸的麦穗,我绝不辜负春天
  9. 使用JDBCTemplate实现与Spring结合,方法公用 ——接口(BaseDao)
  10. Servlet API