责任链模式详解:从Servlet过滤器到订单创建流程

发布时间:2026/6/12 20:45:36

责任链模式详解:从Servlet过滤器到订单创建流程 责任链模式适合处理“一个请求要经过多个步骤”的场景。比如订单创建要先校验参数再补充数据再算价再落库。内容审核要先文本审核再图片审核再视频审核。Web 请求进入服务前也可能经过鉴权、限流、日志、跨域等多个过滤器。一句话概括责任链模式把多个处理节点串成一条链请求沿着链向后传递每个节点只负责自己的职责。责任链解决什么问题不用责任链时订单创建可能写成这样publicvoidcreateOrder(OrderInfoorder){validate(order);fillOrder(order);calculateAmount(order);saveOrder(order);}这段代码看起来不复杂但问题在于流程和步骤绑死了。如果要在算价前加一个优惠券校验或者在落库后加返佣处理就要修改主流程。订单创建方法校验参数填充订单计算金额订单落库责任链的做法是把每个步骤变成独立处理器然后把处理器串起来。订单请求参数校验处理器订单填充处理器金额计算处理器订单落库处理器处理完成每个处理器只关心自己要做什么以及要不要把请求交给下一个处理器。责任链的三个角色角色作用抽象处理者定义处理方法并保存下一个处理器引用具体处理者实现自己的处理逻辑客户端组装链路并把请求交给链头抽象处理器可以这样写publicabstractclassHandler{protectedHandlernext;publicvoidsetNext(Handlernext){this.nextnext;}publicabstractvoidprocess(OrderInfoorder);}具体处理器做完自己的事后把请求交给下一个节点publicclassOrderValidationextendsHandler{Overridepublicvoidprocess(OrderInfoorder){// 校验订单参数if(next!null){next.process(order);}}}组装链路HandlervalidationnewOrderValidation();HandlerfillnewOrderFill();HandleramountnewOrderAmountCalculate();HandlercreatenewOrderCreate();validation.setNext(fill);fill.setNext(amount);amount.setNext(create);validation.process(newOrderInfo());订单落库金额计算订单填充参数校验客户端订单落库金额计算订单填充参数校验客户端提交订单校验通过继续填充完成继续算价完成继续订单创建完成责任链和普通流程编排有什么区别普通流程编排通常由一个方法集中调用所有步骤validate();fill();calculate();save();责任链则把“下一个步骤是谁”交给处理器或链路配置管理。对比项普通流程责任链步骤关系主流程硬编码节点串联扩展方式修改主流程新增处理器并调整链路节点职责可能混在主流程每个节点职责独立适合场景流程固定且简单步骤较多、可插拔、可扩展责任链不是为了让所有流程都变复杂。它适合步骤多、扩展频繁、每个步骤能独立表达的场景。Servlet Filter 也是典型责任链Web 请求进入服务时经常要经过多个过滤器跨域处理日志记录登录校验权限校验限流处理Controller 方法HTTP 请求CorsFilterLogFilterAuthFilterRateLimitFilterController过滤器通过doFilter决定是否继续向后传递。publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain){// 前置处理chain.doFilter(request,response);// 后置处理}如果某个过滤器发现请求不合法可以直接返回不再调用后续链路。通过不通过请求进入过滤器校验是否通过调用下一个过滤器直接返回错误响应这就是责任链的典型特征请求沿链传递但每个节点都有机会处理、拦截或继续传递。责任链适合哪些业务场景链路节点订单创建参数校验、补充数据、算价、落库、返佣内容审核文本审核、图片审核、视频审核、人工复核审批流组长、主管、总监、负责人Web 过滤器日志、鉴权、限流、跨域风控校验黑名单、频控、设备风险、地理位置风险是否业务请求处理器 1处理器 2处理器 3是否需要继续处理器 4提前结束常见坑坑一链路太长链路太长会导致一次请求经过很多对象性能和可读性都会下降。责任链不是越长越好。坑二链路顺序不清晰责任链对顺序敏感。先算价再填充订单结果可能就是错的。链路顺序最好配置化或集中组装别散落在各处。坑三节点没有明确职责如果一个处理器里既校验参数又查库存又写日志它就不是一个清晰节点。责任链要求节点职责边界清楚。坑四出现循环调用如果链路配置错误可能出现 A 调 BB 又调回 A。生产代码里可以在链路构建阶段做校验避免循环。责任链设计职责单一顺序明确可插拔扩展避免循环控制链路长度面试怎么说可以这样回答我在订单创建和请求过滤这类场景里用过责任链模式。责任链会把多个处理步骤拆成独立处理器每个处理器只负责自己的逻辑并持有下一个处理器引用。请求从链头开始传递节点处理完后决定继续向后传还是直接结束。它的好处是降低请求发送者和多个处理节点之间的耦合新增步骤时可以新增处理器并调整链路顺序。但要注意链路不能太长顺序要明确也要避免配置错误导致循环调用。小结责任链模式最适合回答“多个处理步骤怎么优雅组织”。可以这样记策略模式解决多选一责任链模式解决按顺序过多关。当一个请求天然要经过多个关卡而且这些关卡还可能增减调整时责任链就很适合。

相关新闻