【设计模式|第八篇】深入解析责任链模式
责任链模式是一种行为型设计模式,通过创建处理请求的接收者链来解耦发送者和接收者。该模式的核心思想是将请求沿处理链传递,直到有对象处理为止,实现动态链式处理和责任分离。典型应用包括订单处理系统、OA审批流程和Web请求过滤链等。模式结构包含抽象处理器和具体处理器,实现方式灵活且易于扩展。优点包括降低耦合度、增强灵活性和单一职责原则,但可能存在性能影响和调试困难的问题。实际案例包括Java Servl
·
责任链模式详解
什么是责任链模式?
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它将请求的发送者和接收者解耦,通过创建一个处理请求的接收者链来处理请求。这种模式允许请求沿着处理链传递,直到有一个对象处理它为止。
核心思想
- 解耦发送者和接收者:发送者不需要知道具体由哪个接收者处理请求
- 动态链式处理:可以灵活地调整处理链的顺序和组成
- 责任分离:每个处理器只关注自己负责的部分
工作流程示例
以电商订单处理为例:
- 用户提交订单
- 系统依次执行:
- 库存校验(检查商品是否有货)
- 风控校验(检查用户是否存在欺诈风险)
- 支付信息校验(检查支付方式是否有效)
- 物流校验(检查配送地址是否可达)
- 任何一个环节失败,整个流程终止并返回相应错误
- 所有环节通过后,订单创建完成
模式结构
Handler(抽象处理器)
定义处理请求的接口,通常包含:
public abstract class Handler {
protected Handler nextHandler;
public void setNext(Handler handler) {
this.nextHandler = handler;
}
public abstract void handleRequest(Request request);
}
ConcreteHandler(具体处理器)
实现具体的处理逻辑,例如:
public class InventoryHandler extends Handler {
@Override
public void handleRequest(Request request) {
if (checkInventory(request)) {
if (nextHandler != null) {
nextHandler.handleRequest(request);
}
} else {
throw new RuntimeException("库存不足");
}
}
private boolean checkInventory(Request request) {
// 实际的库存检查逻辑
}
}
典型应用场景
1. 订单处理系统
- 库存校验:检查商品库存是否充足
- 价格校验:检查商品价格是否发生变化
- 优惠券校验:验证优惠券是否有效
- 风控校验:评估订单欺诈风险
- 支付校验:验证支付方式和金额
2. OA审批系统
- 部门审批:部门经理审批
- 财务审批:财务部门审核预算
- 高管审批:总经理/CEO最终审批
- 归档处理:审批完成后归档
审批金额阈值示例:
- 5万元以下:部门经理审批
- 5-50万元:部门经理→财务总监
- 50万元以上:部门经理→财务总监→CEO
3. Web请求处理
Filter链
- 字符编码过滤器:设置请求/响应编码
- 认证过滤器:检查用户登录状态
- 权限过滤器:验证用户权限
- 日志过滤器:记录请求信息
- 限流过滤器:防止DDoS攻击
Interceptor链
- 参数校验:验证请求参数合法性
- 数据转换:格式化请求数据
- 性能监控:记录方法执行时间
- 异常处理:统一异常捕获和处理
实现方式
基础实现
public abstract class Handler {
private Handler next;
public Handler setNext(Handler next) {
this.next = next;
return next;
}
public abstract boolean handle(Request request);
protected boolean handleNext(Request request) {
if (next == null) {
return true;
}
return next.handle(request);
}
}
Spring中的实现示例
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
return true;
}
default void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) {
}
default void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) {
}
}
优缺点分析
优点
- 降低耦合度:发送者无需知道具体处理器
- 增强灵活性:可以动态调整处理链
- 单一职责:每个处理器只关注自己的逻辑
- 可扩展性:新增处理器无需修改现有代码
缺点
- 性能影响:长处理链可能影响性能
- 调试困难:请求可能在任意环节被处理
- 循环引用:处理链配置不当可能导致循环
实际案例
Java Servlet中的FilterChain
public interface FilterChain {
void doFilter(ServletRequest request, ServletResponse response);
}
// 实现示例
public class ApplicationFilterChain implements FilterChain {
private Filter[] filters;
private int position = 0;
public void doFilter(ServletRequest request, ServletResponse response) {
if (position < filters.length) {
Filter filter = filters[position++];
filter.doFilter(request, response, this);
} else {
// 调用servlet.service()方法
}
}
}
Spring Security的过滤器链
Spring Security使用责任链模式构建了复杂的安全过滤器链,包含:
- SecurityContextPersistenceFilter
- LogoutFilter
- UsernamePasswordAuthenticationFilter
- BasicAuthenticationFilter
- RememberMeAuthenticationFilter
- AnonymousAuthenticationFilter
- ExceptionTranslationFilter
- FilterSecurityInterceptor
更多推荐



所有评论(0)