责任链模式 (Chain of Responsibility Pattern)
将请求沿处理链传递,直到有对象处理它
目录
概述
责任链模式是一种行为型设计模式,它允许你将请求沿着处理链传递。每个处理者都可以决定处理请求或将其传递给链上的下一个处理者。
适用场景
- 多个对象可以处理同一请求
- 需要动态指定处理顺序
- 不希望显式指定处理者
基础实现
// 处理者接口
public abstract class Handler {
protected Handler nextHandler;
public void setNext(Handler handler) {
this.nextHandler = handler;
}
public final void handle(Request request) {
if (canHandle(request)) {
process(request);
} else if (nextHandler != null) {
nextHandler.handle(request);
} else {
System.out.println("无法处理请求");
}
}
protected abstract boolean canHandle(Request request);
protected abstract void process(Request request);
}
// 具体处理者:经理
public class Manager extends Handler {
@Override
protected boolean canHandle(Request request) {
return request.getAmount() <= 1000;
}
@Override
protected void process(Request request) {
System.out.println("经理审批了 " + request.getAmount() + " 元的申请");
}
}
// 具体处理者:总监
public class Director extends Handler {
@Override
protected boolean canHandle(Request request) {
return request.getAmount() <= 5000;
}
@Override
protected void process(Request request) {
System.out.println("总监审批了 " + request.getAmount() + " 元的申请");
}
}
// 使用
Handler manager = new Manager();
Handler director = new Director();
manager.setNext(director);
manager.handle(new Request("报销", 500)); // 经理处理
manager.handle(new Request("报销", 3000)); // 总监处理Spring 过滤器链
// Spring Security 的过滤器链是责任链的典型应用
@Component
public class AuthFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) {
if (isAuthenticated(request)) {
filterChain.doFilter(request, response); // 继续下一个过滤器
} else {
response.setStatus(401);
}
}
}优缺点
| 优点 | 缺点 |
|---|---|
| 解耦发送者和接收者 | 请求可能未被处理 |
| 动态组合处理者 | 性能可能受影响 |
| 符合开闭原则 | 调试困难 |
总结
责任链模式在 Web 开发中非常常见,Servlet Filter、Spring Interceptor 都使用了这种模式。设计时要注意避免过长的链条影响性能。