- 责任链模式详解
- 什么是责任链模式?
- 核心思想
- 工作流程示例
- 模式结构
- Handler(抽象处理器)
- ConcreteHandler(具体处理器)
- 典型应用场景
- 1. 订单处理系统
- 2. OA审批系统
- 3. Web请求处理
- Filter链
- Interceptor链
- 实现方式
- 基础实现
- Spring中的实现示例
- 优缺点分析
- 优点
- 缺点
- 实际案例
- Java Servlet中的FilterChain
- Spring Security的过滤器链
责任链模式详解
什么是责任链模式?
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它将请求的发送者和接收者解耦,通过创建一个处理请求的接收者链来处理请求。这种模式允许请求沿着处理链传递,直到有一个对象处理它为止。
核心思想
- 解耦发送者和接收者:发送者不需要知道具体由哪个接收者处理请求
- 动态链式处理:可以灵活地调整处理链的顺序和组成
- 责任分离:每个处理器只关注自己负责的部分
工作流程示例
以电商订单处理为例:
- 用户提交订单
- 系统依次执行:
- 库存校验(检查商品是否有货)
- 风控校验(检查用户是否存在欺诈风险)
- 支付信息校验(检查支付方式是否有效)
- 物流校验(检查配送地址是否可达)
- 任何一个环节失败,整个流程终止并返回相应错误
- 所有环节通过后,订单创建完成
模式结构
Handler(抽象处理器)
定义处理请求的接口,通常包含:
publicabstractclassHandler{protectedHandlernextHandler;publicvoidsetNext(Handlerhandler){this.nextHandler=handler;}publicabstractvoidhandleRequest(Requestrequest);}ConcreteHandler(具体处理器)
实现具体的处理逻辑,例如:
publicclassInventoryHandlerextendsHandler{@OverridepublicvoidhandleRequest(Requestrequest){if(checkInventory(request)){if(nextHandler!=null){nextHandler.handleRequest(request);}}else{thrownewRuntimeException("库存不足");}}privatebooleancheckInventory(Requestrequest){// 实际的库存检查逻辑}}典型应用场景
1. 订单处理系统
- 库存校验:检查商品库存是否充足
- 价格校验:检查商品价格是否发生变化
- 优惠券校验:验证优惠券是否有效
- 风控校验:评估订单欺诈风险
- 支付校验:验证支付方式和金额
2. OA审批系统
- 部门审批:部门经理审批
- 财务审批:财务部门审核预算
- 高管审批:总经理/CEO最终审批
- 归档处理:审批完成后归档
审批金额阈值示例:
- 5万元以下:部门经理审批
- 5-50万元:部门经理→财务总监
- 50万元以上:部门经理→财务总监→CEO
3. Web请求处理
Filter链
- 字符编码过滤器:设置请求/响应编码
- 认证过滤器:检查用户登录状态
- 权限过滤器:验证用户权限
- 日志过滤器:记录请求信息
- 限流过滤器:防止DDoS攻击
Interceptor链
- 参数校验:验证请求参数合法性
- 数据转换:格式化请求数据
- 性能监控:记录方法执行时间
- 异常处理:统一异常捕获和处理
实现方式
基础实现
publicabstractclassHandler{privateHandlernext;publicHandlersetNext(Handlernext){this.next=next;returnnext;}publicabstractbooleanhandle(Requestrequest);protectedbooleanhandleNext(Requestrequest){if(next==null){returntrue;}returnnext.handle(request);}}Spring中的实现示例
publicinterfaceHandlerInterceptor{defaultbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler){returntrue;}defaultvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView){}defaultvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex){}}优缺点分析
优点
- 降低耦合度:发送者无需知道具体处理器
- 增强灵活性:可以动态调整处理链
- 单一职责:每个处理器只关注自己的逻辑
- 可扩展性:新增处理器无需修改现有代码
缺点
- 性能影响:长处理链可能影响性能
- 调试困难:请求可能在任意环节被处理
- 循环引用:处理链配置不当可能导致循环
实际案例
Java Servlet中的FilterChain
publicinterfaceFilterChain{voiddoFilter(ServletRequestrequest,ServletResponseresponse);}// 实现示例publicclassApplicationFilterChainimplementsFilterChain{privateFilter[]filters;privateintposition=0;publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse){if(position<filters.length){Filterfilter=filters[position++];filter.doFilter(request,response,this);}else{// 调用servlet.service()方法}}}Spring Security的过滤器链
Spring Security使用责任链模式构建了复杂的安全过滤器链,包含:
- SecurityContextPersistenceFilter
- LogoutFilter
- UsernamePasswordAuthenticationFilter
- BasicAuthenticationFilter
- RememberMeAuthenticationFilter
- AnonymousAuthenticationFilter
- ExceptionTranslationFilter
- FilterSecurityInterceptor