利用责任链模式设计一个拦截器(下)

简介: 近期在做 Cicada 的拦截器功能,正好用到了责任链模式。 这个设计模式在日常使用中频率还是挺高的,借此机会来分析分析。

用责任链模式设计一个拦截器


对于拦截器来说使用责任链模式再好不过了。


下面来看看在 Cicada 中的实现:

首先是定义了和上文 Process 接口类似的 CicadaInterceptor 抽象类:


public abstract class CicadaInterceptor {
    public boolean before(CicadaContext context,Param param) throws Exception{
        return true;
    }
    public void after(CicadaContext context,Param param) throws Exception{}
}


同时定义了一个 InterceptProcess 的客户端:



其中的 loadInterceptors() 会将所有的拦截器加入到责任链中。


再提供了两个函数分别对应了拦截前和拦截后的入口:



实际应用


现在来看看具体是怎么使用的吧。



在请求的 handle 中首先进行加载(loadInterceptors(AppConfig appConfig)),也就是初始化责任链。


接下来则是客户端的入口;调用拦截前后的入口方法即可。


由于是拦截器,那么在 before 函数中是可以对请求进行拦截的。只要返回 false 就不会继续向后处理。所以这里做了一个返回值的判断。


同时对于使用者来说只需要创建拦截器类继承 CicadaInterceptor 类即可。


这里做了一个演示,分别有两个拦截器:


  1. 记录一个业务 handle 的执行时间。


  1. after 里打印了请求参数。


  1. 同时可在第一个拦截器中返回 false 让请求被拦截。


先来做前两个试验:


这样当我请求其中一个接口时会将刚才的日志打印出来:



接下来我让打印执行时间的拦截器中拦截请求,同时输入向前端输入一段文本:



请求接口可以看到如下内容:




同时后面的请求参数也没有打印出来,说明请求确实被拦截下来。


同时我也可以调整拦截顺序,只需要在@Interceptor(order = 1) 注解中定义这个 order 属性即可(默认值是 0,越小越先执行)。


之前是打印请求参数的拦截器先执行,这次我手动将它的 order 调整为 2,而打印时间的 order 为 1 。



再次请求接口观察后台日志:



发现打印执行时间的拦截器先执行。


那这个执行执行顺序如何实现自定义配置的呢?


其实也比较简单,有以下几步:


  • 在加载拦截器时将注解里的 order 保存起来。


  • 设置拦截器到责任链中时通过反射将 order 的值保存到各个拦截器中。


  • 最终通过排序重新排列这个责任链的顺序。


贴一些核心代码。


扫描拦截器时保存 order 值:



保存 order 值到拦截器中:



重新对责任链排序:



总结


整个责任链模式已经讲完,希望对这个设计模式还不了解的朋友带来些帮助。


上文中的源码如下:




相关文章
|
3月前
|
设计模式 存储 开发者
如何在业务代码中优雅地使用责任链模式
责任链模式是一种行为设计模式,本文从责任链模式的定义到其优雅之处、合适的应用场景、应用示例、实现步骤等方面详细讲述了如何在业务代码中优雅的使用责任链模式。
|
3月前
|
设计模式
|
5月前
|
设计模式 监控 开发者
在业务代码中如何优雅地使用责任链模式
在日常开发中,随着业务逻辑的复杂性和系统规模的增加,我们开发者往往面临着代码结构混乱、模块间耦合度高等问题,如何保持代码的清晰、可维护和可扩展性成为了一个重要的挑战。为了解决这个问题,我们需要借助一些设计模式来优化代码结构,提高代码的可读性和可维护性,那么责任链模式就是一种非常实用的设计模式,是解决这一问题的有效手段之一,它可以帮助我们优雅地处理业务逻辑中的复杂请求,该模式通过构建一系列处理者对象,并将它们连接成一条链,使得请求可以在这些处理者之间传递,直到被恰当处理。那么接下来,我们将探讨如何在业务代码中优雅地使用责任链模式,欢迎在评论区留言交流。
74 5
在业务代码中如何优雅地使用责任链模式
|
5月前
|
设计模式 JavaScript 前端开发
如何优雅的使用责任链模式?
【6月更文挑战第7天】如何优雅的使用责任链模式?
|
6月前
|
设计模式 缓存 Java
如何在业务代码中优雅地使用责任链模式?
【5月更文挑战第26天】责任链模式(Chain of Responsibility Pattern)是一种设计模式,用于处理请求的发送者和接收者之间的解耦。
108 1
|
6月前
行为型 责任链模式(过滤器模式)
行为型 责任链模式(过滤器模式)
51 1
|
设计模式 Java
设计模式~~~责任链模式(职责链模式)
设计模式~~~责任链模式(职责链模式)
65 0
|
设计模式 Java
一环扣一环:解析Java设计模式中的责任链模式
在软件开发领域,设计模式是一组经过验证的最佳实践方法,用于解决各种常见问题。责任链模式是一种行为型设计模式,其目标是构建一条对象链,每个对象都能够处理请求并将其传递给下一个对象。在本文中,我们将深入了解责任链模式的核心思想、应用场景以及它在Java中的实际运用。
111 0
|
设计模式
设计模式-职责链+反射
设计模式-职责链+反射
52 0
|
设计模式
职责链设计模式解读
职责链设计模式解读