2026/6/9 17:23:20
网站建设
项目流程
汕头建设局网站,比较好的网站设计,二十个知名品牌vi案例,网站建站加盟一、先明确#xff1a;为什么考察责任链模式#xff1f;你是否能通过通俗例子理解责任链模式的核心思想#xff0c;而非背枯燥定义#xff1f;能否掌握责任链模式的核心结构#xff0c;并用 Java 代码实现简单的责任链#xff1f;能否关联实际项目中的应用#xff08;如…一、先明确为什么考察责任链模式你是否能通过通俗例子理解责任链模式的核心思想而非背枯燥定义能否掌握责任链模式的核心结构并用 Java 代码实现简单的责任链能否关联实际项目中的应用如 Spring 拦截器、Servlet 过滤器体现理论结合实践的能力二、先铺垫什么是责任链模式1. 通俗定义责任链模式Chain of Responsibility Pattern是指将多个处理者连成一条链式结构当一个请求到来时请求会沿着这条链依次传递直到有一个处理者能处理该请求或遍历完所有处理者为止。每个处理者只负责自己职责范围内的请求超出范围则传递给下一个处理者实现 “请求与处理解耦”。2. 生活类比最典型的例子是请假审批流程员工请假 1 天组长即可审批处理请求无需传递给上级员工请假 3 天组长无权处理自动传递给经理审批员工请假 7 天经理无权处理自动传递给总监审批员工请假 15 天总监也无权处理传递到总经理审批或最终无人处理返回审批失败。这里的 “组长→经理→总监→总经理” 就是一条责任链每个角色是 “处理者”请假天数是 “请求信息”处理者根据自身权限决定是处理请求还是传递给下一个。三、核心责任链模式的 3 大角色角色名称核心职责对应请假场景示例抽象处理者Handler1. 定义统一的请求处理方法2. 持有下一个处理者的引用形成链式结构3. 声明传递请求的逻辑AbstractApprover抽象审批者具体处理者ConcreteHandler1. 实现抽象处理者的处理方法2. 根据自身能力判断是否处理请求3. 无法处理则传递给下一个处理者GroupLeader组长、Manager经理、Director总监请求对象Request封装请求的相关信息如请求类型、请求参数等供处理者判断和使用LeaveRequest请假请求包含请假人、天数、理由四、项目应用为什么要用责任链模式运费模板的查找存在明确的优先级规则同城寄 省内寄 经济区互寄 跨省寄。必须按此顺序依次判断先检查是否为同城若否再检查是否为省内以此类推找到第一个匹配的模板后立即停止无需后续判断未来可能扩展新模板类型如「跨境寄」需保证扩展时不修改原有逻辑符合「开闭原则」。若用传统的 if-else 逻辑会导致代码耦合严重、扩展性差新增类型需修改判断条件。而责任链模式通过「链式结构」和「处理器分工」完美解决了这两个问题。五、项目中责任链模式的核心组件责任链模式的核心是「抽象处理器 具体处理器 链组装器」对应实现如下1. 抽象处理器定义链节点的统一规范抽象类 AbstractCarriageChainHandler 是责任链的「骨架」定义了所有处理器的统一接口和链传递规则public abstract class AbstractCarriageChainHandler { // 下一个处理器链的节点关联 private AbstractCarriageChainHandler nextHandler; // 抽象处理方法子类必须实现自己的匹配逻辑 public abstract CarriageEntity doHandler(WaybillDTO waybillDTO); // 传递请求到下一个处理器核心传递逻辑 protected CarriageEntity doNextHandler(WaybillDTO waybillDTO, CarriageEntity carriageEntity) { // 终止条件没有下一个处理器或当前已找到匹配模板carriageEntity ! null if (nextHandler null || carriageEntity ! null) { return carriageEntity; } // 否则传递给下一个处理器 return nextHandler.doHandler(waybillDTO); } // 设置下一个处理器用于组装链 public void setNextHandler(AbstractCarriageChainHandler nextHandler) { this.nextHandler nextHandler; } }核心作用封装「链的传递规则」doNextHandler和「节点关联方式」nextHandler子类只需专注于自己的「匹配逻辑」doHandler。2. 具体处理器实现各自的匹配逻辑4 种模板类型分别实现了具体处理器每个处理器只负责判断「当前请求是否符合自己的模板类型」并通过 Order 注解定义优先级具体处理器类功能匹配逻辑Order 优先级越小越先执行SameCityChainHandler判断收发城市是否相同同城寄100SameProvinceChainHandler判断收发城市是否同省省内寄200EconomicZoneChainHandler判断收发城市是否属于同一经济区经济区互寄300TransProvinceChainHandler默认处理跨省寄无匹配时最后执行400以「同城寄处理器」为例其实现逻辑Component Order(100) // 优先级最高 public class SameCityChainHandler extends AbstractCarriageChainHandler { Resource private CarriageService carriageService; Override public CarriageEntity doHandler(WaybillDTO waybillDTO) { CarriageEntity carriageEntity null; // 匹配逻辑判断收发城市ID是否相同 if (ObjectUtil.equals(waybillDTO.getReceiverCityId(), waybillDTO.getSenderCityId())) { // 匹配成功查询同城寄模板 carriageEntity carriageService.findByTemplateType(CarriageConstant.SAME_CITY); } // 传递给下一个处理器若已找到模板下一个处理器不会再处理 return doNextHandler(waybillDTO, carriageEntity); } }每个具体处理器的核心逻辑「判断是否匹配」→「匹配则查询模板」→「传递给下一个处理器」。3. 链组装器构建完整的责任链CarriageChainHandler 类负责将所有具体处理器按 Order 顺序组装成链Component public class CarriageChainHandler { // Spring自动注入所有AbstractCarriageChainHandler实现类并按Order排序 Resource private ListAbstractCarriageChainHandler chainHandlers; // 链的首节点 private AbstractCarriageChainHandler firstHandler; // 初始化时组装链PostConstructSpring实例化后执行 PostConstruct private void constructChain() { if (CollUtil.isEmpty(chainHandlers)) { throw new SLException(未找到运费模板处理器); } // 第一个处理器作为首节点 firstHandler chainHandlers.get(0); // 依次设置每个处理器的下一个节点 for (int i 0; i chainHandlers.size(); i) { if (i chainHandlers.size() - 1) { // 最后一个处理器下一个节点为null链的终点 chainHandlers.get(i).setNextHandler(null); } else { // 当前处理器的下一个节点 下一个处理器 chainHandlers.get(i).setNextHandler(chainHandlers.get(i 1)); } } } // 对外提供查询入口从首节点开始处理请求 public CarriageEntity findCarriage(WaybillDTO waybillDTO) { return firstHandler.doHandler(waybillDTO); } }关键逻辑利用 Spring 的依赖注入特性自动收集所有具体处理器并按 Order 排序再通过循环设置每个节点的 nextHandler构建出「同城→省内→经济区→跨省」的完整责任链。六、工作流程假设用户下单「从北京senderCityId2寄到上海receiverCityId161793」请求会沿着责任链按以下步骤处理请求进入链首节点调用 CarriageChainHandler.findCarriage(waybillDTO)请求从首节点 SameCityChainHandler 开始。同城寄处理器处理判断北京≠上海不同城未找到模板carriageEntitynull通过 doNextHandler 传递给下一个处理器 SameProvinceChainHandler。省内寄处理器处理通过 AreaFeign 查询北京直辖市和上海直辖市属于不同省份未找到模板传递给下一个处理器 EconomicZoneChainHandler。经济区互寄处理器处理判断北京京津冀和上海江浙沪不属于同一经济区未找到模板传递给最后一个处理器 TransProvinceChainHandler。跨省寄处理器处理默认匹配查询跨省寄模板返回模板对象carriageEntity≠null。链终止由于已找到模板doNextHandler 直接返回结果不再传递责任链处理结束。最终系统拿到跨省寄模板用于后续运费计算。七、应用优势解耦请求发送者与接收者运费计算逻辑CarriageServiceImpl.compute只需调用 CarriageChainHandler.findCarriage无需关心模板查找的具体顺序和处理器发送者与接收者完全解耦。符合开闭原则扩展性极强若新增「跨境寄」模板只需新增一个 CrossBorderChainHandler 类实现 doHandler 逻辑并设置 Order(500)无需修改原有处理器和链组装器代码。逻辑清晰职责单一每个处理器只负责一种模板类型的匹配逻辑代码可读性高便于维护比如修改同城寄的匹配规则只需修改 SameCityChainHandler。灵活调整顺序只需修改 Order 注解的数值即可调整模板查找的优先级比如将经济区互寄的优先级高于省内寄只需把 EconomicZoneChainHandler 的 Order 改为 150。总结该运费微服务中的责任链模式完美贴合业务场景需求通过「抽象处理器定义规范、具体处理器实现逻辑、链组装器构建顺序」实现了「按优先级查找运费模板」的核心功能同时保证了代码的解耦性、扩展性和可维护性。其本质是将「多条件优先级判断」转化为「链式节点处理」是责任链模式在实际业务中典型且优雅的应用。