news 2026/4/23 7:55:29

【设计模式|第八篇】深入解析责任链模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【设计模式|第八篇】深入解析责任链模式
  • 责任链模式详解
    • 什么是责任链模式?
      • 核心思想
      • 工作流程示例
    • 模式结构
      • Handler(抽象处理器)
      • ConcreteHandler(具体处理器)
    • 典型应用场景
      • 1. 订单处理系统
      • 2. OA审批系统
      • 3. Web请求处理
        • Filter链
        • Interceptor链
    • 实现方式
      • 基础实现
      • Spring中的实现示例
    • 优缺点分析
      • 优点
      • 缺点
    • 实际案例
      • Java Servlet中的FilterChain
      • Spring Security的过滤器链

责任链模式详解

什么是责任链模式?

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它将请求的发送者和接收者解耦,通过创建一个处理请求的接收者链来处理请求。这种模式允许请求沿着处理链传递,直到有一个对象处理它为止。

核心思想

  1. 解耦发送者和接收者:发送者不需要知道具体由哪个接收者处理请求
  2. 动态链式处理:可以灵活地调整处理链的顺序和组成
  3. 责任分离:每个处理器只关注自己负责的部分

工作流程示例

以电商订单处理为例:

  1. 用户提交订单
  2. 系统依次执行:
    • 库存校验(检查商品是否有货)
    • 风控校验(检查用户是否存在欺诈风险)
    • 支付信息校验(检查支付方式是否有效)
    • 物流校验(检查配送地址是否可达)
  3. 任何一个环节失败,整个流程终止并返回相应错误
  4. 所有环节通过后,订单创建完成

模式结构

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链
  1. 字符编码过滤器:设置请求/响应编码
  2. 认证过滤器:检查用户登录状态
  3. 权限过滤器:验证用户权限
  4. 日志过滤器:记录请求信息
  5. 限流过滤器:防止DDoS攻击
Interceptor链
  1. 参数校验:验证请求参数合法性
  2. 数据转换:格式化请求数据
  3. 性能监控:记录方法执行时间
  4. 异常处理:统一异常捕获和处理

实现方式

基础实现

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){}}

优缺点分析

优点

  1. 降低耦合度:发送者无需知道具体处理器
  2. 增强灵活性:可以动态调整处理链
  3. 单一职责:每个处理器只关注自己的逻辑
  4. 可扩展性:新增处理器无需修改现有代码

缺点

  1. 性能影响:长处理链可能影响性能
  2. 调试困难:请求可能在任意环节被处理
  3. 循环引用:处理链配置不当可能导致循环

实际案例

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使用责任链模式构建了复杂的安全过滤器链,包含:

  1. SecurityContextPersistenceFilter
  2. LogoutFilter
  3. UsernamePasswordAuthenticationFilter
  4. BasicAuthenticationFilter
  5. RememberMeAuthenticationFilter
  6. AnonymousAuthenticationFilter
  7. ExceptionTranslationFilter
  8. FilterSecurityInterceptor
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 7:15:19

如何永久擦除索尼 XQD 卡上的数据

您的数码相机上使用的是索尼 XQD 卡&#xff0c;现在想要清除卡上的数据吗&#xff1f;无论您是准备出售存储卡&#xff0c;还是仅仅需要一个全新的、优化的存储方案&#xff0c;您都需要了解如何永久清除索尼 XQD 卡上的数据。我们将介绍在 Windows 和 Mac 电脑上清除存储卡的…

作者头像 李华
网站建设 2026/4/21 21:36:10

QuickLook视频预览兼容性优化全攻略:从零到精通

QuickLook视频预览兼容性优化全攻略&#xff1a;从零到精通 【免费下载链接】QuickLook Bring macOS “Quick Look” feature to Windows 项目地址: https://gitcode.com/gh_mirrors/qu/QuickLook 还在为Windows文件预览功能不足而烦恼吗&#xff1f;QuickLook作为一款优…

作者头像 李华
网站建设 2026/4/18 13:10:49

【光照】[各向异性]在UnityURP中的实现

模型原理与特点Kajiya-Kay模型是一种专门用于模拟头发、毛发等纤维状材质各向异性高光的光照模型&#xff0c;其核心特点是用切线方向替代传统法线方向计算高光反射。该模型具有以下特性&#xff1a;‌切线空间计算‌&#xff1a;使用切线向量(Tangent)或副切线(Bitangent)替代…

作者头像 李华
网站建设 2026/4/21 5:26:25

Simple Icons 终极指南:快速掌握3000+品牌SVG图标的高效使用技巧

Simple Icons 终极指南&#xff1a;快速掌握3000品牌SVG图标的高效使用技巧 【免费下载链接】simple-icons 项目地址: https://gitcode.com/gh_mirrors/sim/simple-icons 在现代Web开发中&#xff0c;品牌图标是不可或缺的设计元素。Simple Icons作为一个拥有3000多个开…

作者头像 李华
网站建设 2026/4/22 15:21:33

如何快速掌握MouseTester:鼠标性能诊断的完整解决方案

如何快速掌握MouseTester&#xff1a;鼠标性能诊断的完整解决方案 【免费下载链接】MouseTester 项目地址: https://gitcode.com/gh_mirrors/mo/MouseTester 还在为游戏中的瞄准不准而烦恼&#xff1f;或是设计工作时鼠标轨迹不够平滑影响创作效率&#xff1f;MouseTes…

作者头像 李华
网站建设 2026/4/22 11:07:21

Netcode for GameObjects Boss Room 多人RPG战斗(11)

Unity Boss Room 角色系统 1. 角色系统 Unity Boss Room项目采用了客户端-服务器分离的角色架构,通过模块化设计实现了角色的网络同步、AI行为、移动控制和战斗逻辑。 核心组件结构 组件 职责 文件位置 ServerCharacter 服务器端角色核心逻辑 ClientCharacter 客户端角色可…

作者头像 李华