一、核心概念与定义

责任链模式是一种行为型设计模式,其核心思想是将请求沿着处理对象链传递,直到某个对象能够处理该请求为止。通过这种方式,解耦了请求的发送者与接收者,使多个对象有机会处理同一请求。
关键特点:

  1. 动态解耦:请求发送者无需知道具体处理者,只需将请求发送到链的起点。
  2. 灵活扩展:可通过动态调整链内处理者顺序或增减节点,满足开闭原则。
  3. 链式传递:每个处理者决定是否处理请求,否则将请求传递给下一个节点。

二、模式结构

责任链模式包含以下角色:

  1. 抽象处理者(Handler)
    • 定义处理请求的接口,并包含对下一个处理者的引用。
    • 例如:public abstract class Handler { protected Handler next; }
  2. 具体处理者(ConcreteHandler)
    • 实现抽象处理者的逻辑,判断是否处理请求。若无法处理,则调用next.handleRequest()传递请求。
    • 例如:请假审批中的TeamLeaderManager等角色。
  3. 客户端(Client)
    • 创建处理链并发送请求,通常只需与链的起点交互。
    • 例如:构造链teamLeader.setNext(manager).setNext(director)并调用handleRequest()

三、实现方式

  1. 链表式实现(经典方式)
    通过链表维护处理者顺序,每个处理者持有下一个节点的引用:
public abstract class Handler {protected Handler next;public void setNext(Handler next) { this.next = next; }public abstract void handleRequest(Request request);
}
// 具体处理者示例(日志级别处理)
public class ErrorLogHandler extends Handler {@Overridepublic void handleRequest(Request request) {if (request.getLevel() == LogLevel.ERROR) {System.out.println("Error: " + request.getMessage());} else if (next != null) {next.handleRequest(request);}}
}

特点:

  • 适合需要动态调整链结构的场景。
  • 可能因链过长导致性能下降。
  1. 数组式实现(优化方式)
    使用数组或集合存储处理者,按顺序依次调用:
public class HandlerChain {private List handlers = new ArrayList<>();public void addHandler(Handler handler) { handlers.add(handler); }public void process(Request request) {for (Handler h : handlers) {if (!h.handle(request)) break; // 中断式处理}}
}

特点:

  • 更易维护,避免循环引用风险。
  • 适合固定顺序的处理流程(如过滤器链)。

四、优缺点分析

优点缺点
解耦性:请求发送者与处理者无直接依赖。请求可能未被处理:若链未覆盖所有情况,请求可能被忽略。
灵活性:动态增减或调整处理者顺序。性能损耗:长链可能导致多次判断与传递。
单一职责:每个处理者仅关注自身逻辑。调试复杂:链式调用可能增加调试难度。

五、典型应用场景

  1. 审批流程
    • 示例:请假申请按天数由组长、经理、总监逐级审批。
    teamLeader.setNext(manager).setNext(director);
    teamLeader.handleRequest(5); // 输出:Manager 批准了5天假期。
    
  2. 日志系统
    • 按日志级别(DEBUG/INFO/ERROR)分层处理,不同级别日志由对应处理器记录。
  3. 过滤器链
    • Web框架中的请求过滤器(如认证、日志记录、权限校验)。
  4. 事件处理
    • 传感器信号依次经过噪声过滤、数据格式化、异常检测等处理器。

六、与其他模式的对比

  • 策略模式:策略模式通过组合不同算法实现单一功能,而责任链模式通过链式传递请求。
  • 命令模式:命令模式将请求封装为对象,责任链模式关注请求的传递路径。

七、总结

责任链模式通过链式处理机制,有效解耦了请求发送者与接收者,适用于需要动态分配职责或按顺序处理请求的场景。实际开发中需权衡链的长度与性能,优先选择数组式实现或结合框架(如Spring拦截器链)提升效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914294.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914294.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914294.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL server之版本的初认知

SQL server之版本的初认知 为什么要编写此篇文档呢&#xff0c;主要是因为在最近测试OGG实时同步SQL server数据库表数据的时候&#xff0c;经过多次测试&#xff0c;发现在安装了一套SQL server2017初始版本&#xff0c;未安装任何补丁的时候&#xff0c;在添加TRANDATA的时候…

【前端】jQuery动态加载CSS方法总结

在jQuery 中动态加载 CSS 文件有多种方法&#xff0c;以下是几种常用实现方式&#xff1a; 方法 1&#xff1a;创建 <link> 标签&#xff08;推荐&#xff09; // 动态加载外部 CSS 文件 function loadCSS(url) {$(<link>, {rel: stylesheet,type: text/css,href:…

Python爬虫实战:研究xlwings库相关技术

1. 引言 在金融科技快速发展的背景下,数据驱动决策已成为投资领域的核心竞争力。金融市场数据具有海量、多源、实时性强等特点,传统人工收集与分析方式难以满足高效决策需求。Python 凭借其丰富的开源库生态,成为金融数据分析的首选语言。结合 Requests、BeautifulSoup 等爬…

Linux 内核日志中常见错误

目录 **1. `Oops`****含义****典型日志****可能原因****处理建议****2. `panic`****含义****典型日志****可能原因****处理建议****3. `BUG`****含义****典型日志****可能原因****处理建议****4. `kernel NULL pointer`****含义****典型日志****可能原因****处理建议****5. `WA…

Linux驱动开发2:字符设备驱动

Linux驱动开发2&#xff1a;字符设备驱动 字符设备驱动开发流程 字符设备是 Linux 驱动中最基本的一类设备驱动&#xff0c;字符设备就是一个一个字节&#xff0c;按照字节流进行读写操作的设备&#xff0c;读写数据是分先后顺序的。比如最常见的点灯、按键、 IIC、 SPI&#x…

RuoYi-Cloud 验证码处理流程

以该处理流程去拓展其他功能模块处理流程&#xff0c;进而熟悉项目开发代码一、思路JavaWeb流程主干线&#xff1a;发起请求、处理请求、响应请求二、登录页面在登录页面按键F12打开开发者工具&#xff0c;点击network&#xff0c;刷新页面&#xff0c;点击code&#xff0c;查看…

云计算三大服务模式深度解析:IaaS、PaaS、SaaS

架构本质&#xff1a;云计算服务模式定义了资源抽象层级和责任分担边界&#xff0c;形成从基础设施到应用的全栈服务金字塔。三种模式共同构成云计算的服务交付模型核心框架。一、服务模式全景图 #mermaid-svg-f0Klw2fbuhBQqJTh {font-family:"trebuchet ms",verdana…

【sql学习之拉链表】

1.拉链表理解 记录历史。记录一个事物从开始&#xff0c;一直到当前状态的所有变化的信息。字段说明&#xff1a; start_dt&#xff1a;该条记录的生命周期开始时间 end_dt&#xff1a;该条记录的生命周期结束时间 end_dt’9999/12/31’表示该条记录目前处于有效状态 如果查询当…

STM32中实现shell控制台(shell窗口输入实现)

文章目录 一、总体结构二、串口接收机制三、命令输入与处理逻辑四、命令编辑与显示五、历史命令管理六、命令执行七、初始化与使用八、小结在嵌入式系统开发中,使用串口Shell控制台是一种非常常见且高效的调试方式。本文将基于STM32平台,分析一个简洁但功能完整的Shell控制台…

区分三种IO模型和select/poll/epoll

部分内容来源&#xff1a;JavaGuide select/poll/epoll 和 三种IO模型之间的关系是什么&#xff1f;区分普通IO和IO多路复用普通IO&#xff0c;即一个线程对应一个连接&#xff0c;因为每个线程只处理一个客户端 socket&#xff0c;目标明确&#xff1a;线程中直接操作该 socke…

Actor-Critic重要性采样原理

目录 AC的数据低效性&#xff1a; 根本原因&#xff1a;策略更新导致数据失效 应用场景&#xff1a; 1. 离策略值函数估计 2. 离策略策略优化 3. 经验回放&#xff08;Experience Replay&#xff09; 4. 策略梯度方法 具体场景分析 场景1&#xff1a;连续策略更新 场…

【赠书福利,回馈公号读者】《智慧城市与智能网联汽车,融合创新发展之路》

「5G行业应用」公号作家团队推出《智慧城市与智能网联汽车&#xff0c;融合创新发展之路》。本书由机械工业出版社出版&#xff0c;探讨如何通过车城融合和创新应用&#xff0c;促进汽车产业转型升级与生态集群发展&#xff0c;提升智慧城市精准治理与出行服务效能。&#xff0…

5G NR PDCCH之处理流程

本节主要介绍PDCCH处理流程概述。PDCCH&#xff08;Physical Downlink Control Channel&#xff0c;物理下行控制信道&#xff09;主要用于传输DCI&#xff08;Downlink Control Information&#xff0c;下行控制信息&#xff09;&#xff0c;用于通知UE资源分配&#xff0c;调…

力扣网编程135题:分发糖果(贪心算法)

一. 简介本文记录力扣网上涉及数组方面的编程题&#xff1a;分发糖果。这里使用贪心算法的思路来解决&#xff08;求局部最优&#xff0c;最终求全局最优解&#xff09;&#xff1a;每个孩子只需要考虑与相邻孩子的相对关系。二. 力扣网编程135题&#xff1a;分发糖果&#xff…

每日mysql

什么是Mysql索引最左匹配原则&#xff1f;最左匹配原则是指&#xff0c;在复合索引中&#xff0c;查询条件需要从左到右和索引开始依次完全匹配的时候&#xff0c;复合索引才可以被有效使用。因为联合索引在建立b树的过程中是根据索引的顺序从左到右进行排序的&#xff0c;所以…

树莓派5-ollama-linux-arm64.tgz 下载

1.下载 由于官方下载速度太慢且容易失败&#xff0c;我这里上传了一份到云盘供大家下载&#xff1a; 通过网盘分享的文件&#xff1a;ollama-linux-arm64.tgz 链接: https://pan.baidu.com/s/1tx_OPpl-8O2HJfXlP4tXTg?pwdffwx 提取码: ffwx --来自百度网盘超级会员v4的分享 …

2024年团体程序设计天梯赛

比赛链接 https://ac.nowcoder.com/acm/contest/80027 A&#xff1a; JMU-1 考察搜索的能力百度一下可知&#xff0c;2024 年天梯赛总决赛的比赛日为4 月 20日 参考代码 //2024 年天梯赛总决赛的比赛日为4 月 20日 void solve(){//A20-7cout<<"H\n"; } B&…

基于CMMI的软件质量管理体系深度解析

核心理念&#xff1a;CMMI&#xff08;Capability Maturity Model Integration&#xff09;是通过过程改进驱动质量提升的体系化框架&#xff0c;其本质是建立可量化、可重复、可优化的工程管理能力一、CMMI体系框架与演进 #mermaid-svg-MdDBl2P8fSHYDHMc {font-family:"t…

2025年渗透测试面试题总结-2025年HW(护网面试) 44(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年HW(护网面试) 44 1. SQL注入常用函数 2. SQLMap爆当前库名参数 3. Nmap探测系统参数 4. Nmap小写 …

【操作系统-Day 5】通往内核的唯一桥梁:系统调用 (System Call)

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…