当前位置: 首页 > news >正文

责任链设计模式

一、核心接口定义

MyAbstractChainHandler<T> 接口继承自 Ordered 接口,用于实现链式处理逻辑。

import org.springframework.core.Ordered;public interface MyAbstractChainHandler<T> extends Ordered {void handle(T requestParam);String getChainName();
}

handle 方法处理请求参数,getChainName 方法为处理器分组提供依据。

二、处理上下文实现

MyChainContext<T> 类实现 ApplicationContextAware 接口,管理链式处理过程。

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;public class MyChainContext<T> implements ApplicationContextAware {private final Map<String, List<MyAbstractChainHandler>> chainContext = new ConcurrentHashMap<>();public void handler(String chainName, T requestParam) {List<MyAbstractChainHandler> chainHandlers = chainContext.get(chainName);if (chainHandlers != null) {chainHandlers.forEach(handler -> handler.handle(requestParam));}}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {Map<String, MyAbstractChainHandler> handerBeans = applicationContext.getBeansOfType(MyAbstractChainHandler.class);handerBeans.forEach((beanName, bean) -> {chainContext.computeIfAbsent(bean.getChainName(), k -> new ArrayList<>()).add(bean);});chainContext.forEach((chainName, handlers) -> {handlers.sort(Comparator.comparing(MyAbstractChainHandler::getOrder));});}
}

chainContext 存储处理链及对应处理器列表,handler 方法执行链式处理,setApplicationContext 方法获取 Bean 实例,按链名分组并排序。

三、机制优势与应用

  1. 解耦性:各处理器逻辑独立,降低代码耦合度。
  2. 扩展性:方便添加新处理器,适应业务变化。
  3. 灵活性:可调整处理器顺序,改变处理流程。
  4. 可维护性:清晰的结构便于维护和调试。

在电商系统订单处理等复杂业务场景中,可将不同处理环节设为独立处理器,通过此机制实现高效处理。

http://www.xdnf.cn/news/341047.html

相关文章:

  • 路由器断流排查终极指南:从Ping测试到Wireshark抓包5步定位法
  • Windows Server 2025 安装AMD显卡驱动
  • android.app.Fragment和androidx.fragment:fragment的区别
  • ActiveMQ 源码剖析:消息存储与通信协议实现(四)
  • 预训练模型实战手册:用BERT/GPT-2微调实现10倍效率提升,Hugging Face生态下的迁移学习全链路实践
  • 数据中台-数仓分层结构【Doris】
  • 【LunarVim】CMake LSP配置
  • 基于Kubernetes的Apache Pulsar云原生架构解析与集群部署指南(上)
  • python 上海新闻爬虫
  • Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机”
  • 【前端基础】8、CSS的选择器
  • HTML10:iframe内联框架
  • AI时代企业应用系统架构的新思路与CIO变革指南
  • 如何使用极狐GitLab 软件包仓库功能托管 helm chart?
  • 【RAG技术全景解读】从原理到工业级应用实践
  • Redis 8.0正式发布,再次开源为哪般?
  • 基于STM32、HAL库的CP2102-GMR USB转UART收发器 驱动程序设计
  • keep the pipe Just full But no fuller - BBR 与尘封 40 年的求索
  • ETL介绍及kettle等工具学习
  • 科学发现 | 源于生活的启示与突破计划的创新
  • android-ndk开发(9): undefined reference to `__aarch64_ldadd4_acq_rel` 报错分析
  • [数据库之十一] 数据库索引之联合索引
  • 大模型调优方法与注意事项
  • 【Java 专题补充】流程控制语句
  • RPC、gRPC和HTTP的区别
  • Java大师成长计划之第15天:Java线程基础
  • uniapp|实现多终端视频弹幕组件、内容轮询、信息表情发送(自定义全屏半屏切换、弹幕启用)
  • BGP基础
  • 抛物线法(二次插值法)
  • 《AI大模型应知应会100篇》第52篇:OpenAI API 使用指南与最佳实践