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中的责任链设计模式
java责任链设计模式 在本教程中,我们将学习如何在Java中实现责任链模式. 责任链设计模式涉及到拥有一系列负责处理请求的对象链. 当客户端发送请求时,第一个处理程序将尝试处理该请求. 如果可以处理 ...
- Java中的责任链模式
当应有几个处理器来执行某项操作并为这些处理器定义特定顺序时,就需要采用责任链设计模式. 在运行时处理器顺序的可变性也很重要.模式的UML表示如下: 处理程序定义处理器对象的一般结构. 这里的" ...
- 设计模式示例_责任链设计模式示例
设计模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...
- java 职责链模式_Java中的责任链模式
java 职责链模式 当应有几个处理器来执行某项操作并为这些处理器定义特定顺序时,就需要采用责任链设计模式. 在运行时处理器顺序的可变性也很重要.模式的UML表示如下: 处理程序定义处理器对象的一般结 ...
- java责任链设计模式 订单_Java责任链设计模式实例分析
本文实例讲述了Java责任链设计模式.分享给大家供大家参考,具体如下: 一 代码 abstract class AbstractHandler { private Handler Handler = ...
- 责任链设计模式(过滤器、拦截器)
责任链设计模式(Chain of Responsibility)的应用有:Java Web中的过滤器链.Struts2中的拦截器栈. 先看一个问题: 给定一个字符串"被就业了:),敏感信息, ...
- 行为设计模式 - 责任链设计模式
行为设计模式 - 责任链设计模式 责任链设计模式是行为设计模式之一. 目录[ 隐藏 ] 1责任链设计模式 1.1 JDK中的责任链模式示例 1.2责任链设计模式实例 1.3责任链设计模式 - 基类和接 ...
- 一文弄懂责任链设计模式
目录 背景 什么是责任链 使用场景 结语 背景 最近,我让团队内一位成员写了一个导入功能.他使用了责任链模式,代码堆的非常多,bug 也多,没有达到我预期的效果. 实际上,针对导入功能,我认为模版方法 ...
- 责任链设计模式介绍及实战
责任链设计模式介绍及实战 1.责任链模式 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和 ...
最新文章
- 怎么将计算机网络设置家庭,“windows无法在此计算机上设置家庭组”问题如何解决...
- OpenGL mipmap filters贴图过滤的实例
- Pixhawk原生固件PX4之串口添加读取传感器实现
- 程序运行时堆区和栈区的分配
- 关于c# .net爬虫
- 用python语言写一个简单的计算器
- hdu 1005(规律)
- Asp.net 使用weboffice实现Word在线编辑
- 晚上睡觉手机放床头对大脑会有伤害吗
- 关于圆锥曲线切点弦二级结论的总结与再发现
- 数据库系统——数据模型基本概念详解
- GStreamer应用开发文档的ogg播放器
- 活着的意义--读《此生未完成》有感
- 如何爬取猫眼网电影票房数据
- 汉医健康:“互联网+医疗健康”让患者更有“医”靠
- 色域空间 sRGB Adobe RGB Pro Photo RGB
- Could not find resource xxx/xxxx/xxx.xml报错解决
- 16丨数据分析基础篇答疑
- CommandMethod介绍
- IT培训行业揭秘(五)