一、责任链(Chain of Responsibility Patten)模式是个啥?
想象一下,你要请假。你先把请假申请交给了小组长,小组长一看,这事儿他能决定,就直接批了。要是小组长觉得这事儿得往上汇报,就把申请递给了部门经理。部门经理有权限,就批了;要是经理觉得还得大老板定夺,就又传给大老板,大老板最后拍板。这就是责任链模式的一个生活场景示例。
在编程世界里,责任链模式定义为:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
简单来说,就是有一串对象排着队,一个请求来了,从第一个对象开始看能不能处理,如果能就处理了,如果不能就交给下一个对象,依次类推,直到请求被处理或者到了链的末尾。
二、责任链模式的结构和代码实现
结构
- 抽象处理者(Handler):定义一个处理请求的接口,包含一个后继处理者(successor)的引用,提供设置后继处理者的方法和处理请求的抽象方法。
- 具体处理者(ConcreteHandler):实现抽象处理者的处理请求方法,判断自己是否能处理请求,如果能则处理,否则将请求传递给后继处理者。
代码示例
// 抽象处理者
abstract class Handler {protected Handler successor;public void setSuccessor(Handler successor) {this.successor = successor;}public abstract void handleRequest(int request);
}// 具体处理者1
class ConcreteHandler1 extends Handler {@Overridepublic void handleRequest(int request) {if (request >= 0 && request < 10) {System.out.println("ConcreteHandler1 处理请求 " + request);} else if (successor!= null) {successor.handleRequest(request);}}
}// 具体处理者2
class ConcreteHandler2 extends Handler {@Overridepublic void handleRequest(int request) {if (request >= 10 && request < 20) {System.out.println("ConcreteHandler2 处理请求 " + request);} else if (successor!= null) {successor.handleRequest(request);}}
}// 测试代码
public class ChainOfResponsibilityPattern {public static void main(String[] args) {Handler handler1 = new ConcreteHandler1();Handler handler2 = new ConcreteHandler2();handler1.setSuccessor(handler2);int[] requests = {5, 15, 25};for (int request : requests) {handler1.handleRequest(request);}}
}
在这段代码中,我们创建了一个简单的责任链。ConcreteHandler1
可以处理 0 到 9 的请求,ConcreteHandler2
可以处理 10 到 19 的请求。当一个请求进来时,先由 handler1
尝试处理,如果处理不了就交给 handler2
。
三、Spring Boot 中的责任链模式应用场景
1. Filter 过滤器链
在 Spring Boot 中,Filter 就是责任链模式的典型应用。当一个 HTTP 请求进入应用时,会经过一系列的过滤器。每个过滤器都有自己的职责,比如验证用户身份、处理字符编码、记录日志等。
例如,我们有一个登录验证过滤器 LoginFilter
,一个字符编码过滤器 EncodingFilter
。当请求进来时,LoginFilter
先检查用户是否登录,如果已登录则放行,交给下一个过滤器 EncodingFilter
,EncodingFilter
负责设置字符编码,然后再将请求传递给后续的过滤器或者最终的控制器。
2. Interceptor 拦截器链
Interceptor 也是类似的原理。比如在一个电商系统中,我们可能有一个权限拦截器 PermissionInterceptor
,用于检查用户是否有访问某个资源的权限;还有一个日志拦截器 LoggingInterceptor
,用于记录用户的操作日志。请求进来后,先经过 PermissionInterceptor
检查权限,通过后再经过 LoggingInterceptor
记录日志,最后才到达目标方法。
3. 异常处理链
Spring Boot 的异常处理机制也用到了责任链模式。当程序抛出异常时,会按照一定的顺序寻找合适的异常处理器来处理。比如有一个全局异常处理器 GlobalExceptionHandler
,处理一般性的异常;还有一个特定业务异常处理器 BusinessExceptionHandler
,处理业务逻辑中抛出的特定异常。当异常发生时,先由 BusinessExceptionHandler
尝试处理,如果处理不了,就交给 GlobalExceptionHandler
。
四、总结
责任链模式就像是一场接力赛,请求在不同的处理者之间传递,直到被成功处理。它让代码更加灵活、可维护,不同的处理逻辑可以独立开发、修改和扩展。在 Spring Boot 中,这种模式被广泛应用于各种场景,帮助我们构建更加健壮、高效的应用程序。掌握责任链模式,能让我们在开发中更加得心应手,处理各种复杂的业务逻辑。希望大家通过这篇博客,对责任链模式有更深入的理解,并能在实际项目中灵活运用。