news 2026/5/15 23:29:26

设计模式-责任链模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式-责任链模式

一、责任链模式简介

责任链模式(chain of responsibility pattern) , 通过多个处理器以链式结构连接起来,使得请求可以沿着这条链传递,直到有一个处理器完成对请求的处理。该模式解耦发送者和接收者,发送者不需要关心具体的处理细节,这种类型的设计模式属于行为型模式。

二、使用场景

  • 有多个对象可以处理请求,选择那个对象运行时决定。
  • 需要向多个对象中的一个提交请求,不想明确的指定接收者。

三、责任链模式的组成

抽象处理者(Handler)

  • 职责:定义一个处理请求的接口,包涵可以处理请求的方法和设置下一个处理请求者的方法。

具体处理者(Concreate Handler)

  • 职责:实现处理者接口,实现具体的处理逻辑,判断请求自己是否可以处理,不能处理将请求传到链上的下一个处理器。

请求体(Request)

  • 职责:封装请求者的请求信息,在责任链上进行传播,可以被任何的具体处理者接收和处理。

四、责任链模式示例

假设需要实现一个简单的审批系统,根据员工的请假天数,需要不同级别的上级审批

抽象处理者(Handler)

/** * 审批者接口,定义了责任链模式中的审批节点行为 * 每个审批者可以设置下一个审批者,并执行具体的审批逻辑 */ public interface Approver { /** * 设置下一个审批者 * @param approver 下一个审批者对象,用于构建审批责任链 */ void setNextApprover(Approver approver); /** * 执行审批操作 * @param leave 待审批的请假申请对象 */ void approve(Leave leave); }

具体处理者(Concreate Handler)

组长

/** * 小组长审批者实现类,负责处理1-3天的请假申请 * 实现Approver接口,构成责任链模式中的一环 */ public class GroupLeaderApprover implements Approver { private Approver nextApprover; /** * 设置下一个审批者 * * @param approver 下一个审批者对象,用于构建审批责任链 */ @Override public void setNextApprover(Approver approver) { this.nextApprover = approver; } /** * 执行审批操作 * 根据请假天数决定是否由当前审批者处理或传递给下一级审批者 * * @param leave 待审批的请假申请对象 */ @Override public void approve(Leave leave) { // 参数验证 if (leave == null) { throw new IllegalArgumentException("请假申请不能为空"); } int leaveDays = leave.getLeaveDays(); // 小于三天组长审批 if (leaveDays <= 3) { System.out.println("小组长审批通过"); leave.setStatus("小组长审批通过"); } else { // 超出当前审批权限且存在下一级审批者时,传递给下一级 if (nextApprover != null) { nextApprover.approve(leave); } else { System.out.println("没有下一级审批者,无法处理"); } } } }

部长

/** * 部门主管审批者类,实现审批者接口 * 负责处理3-7天的请假申请审批 */ public class DepartmentHeadApprover implements Approver { private Approver nextApprover; /** * 设置下一个审批者 * * @param approver 下一个审批者对象,用于构建审批责任链 */ @Override public void setNextApprover(Approver approver) { this.nextApprover = approver; } /** * 执行审批操作 * * @param leave 待审批的请假申请对象 */ @Override public void approve(Leave leave) { if (leave == null) { throw new NullPointerException("请假申请不能为空"); } int leaveDays = leave.getLeaveDays(); // 审批3-7天的请假申请 if (leaveDays >= 3 && leaveDays < 7) { System.out.println("部门主管审批通过"); leave.setStatus("部门主管审批通过"); } else { // 超出部门主管审批范围,转交给下一个审批者 if (nextApprover != null) { nextApprover.approve(leave); } else { System.out.println("没有下一级审批者,无法处理"); } } } }

董事长

public class ChairpersonApprover implements Approver { private Approver nextApprover; /** * 设置下一个审批者 * * @param approver 下一个审批者对象,用于构建审批责任链 */ @Override public void setNextApprover(Approver approver) { this.nextApprover = approver; } /** * 执行审批操作 * * @param leave 待审批的请假申请对象 */ @Override public void approve(Leave leave) { if (leave == null) { throw new NullPointerException("请假申请不能为空"); } int leaveDays = leave.getLeaveDays(); if (leaveDays >= 7) { System.out.println("chairpersonApprove: 董事长审批通过"); leave.setStatus("董事长审批通过"); } else { if (nextApprover != null) { nextApprover.approve(leave); } else { System.out.println("没有下一级审批者,无法处理"); } } } }

测试

/** * 客户端测试类,用于演示责任链模式的请假审批流程 */ public class Client { /** * 程序入口方法 * @param args 命令行参数数组 */ public static void main(String[] args) { // 创建请假对象并设置请假信息 Leave leave = new Leave(); leave.setUserName("张三"); leave.setLeaveDays(2); leave.setReason("事假"); // 创建各级审批者对象 Approver groupLeaderApprover = new GroupLeaderApprover(); Approver departmentHead = new DepartmentHeadApprover(); Approver chairpersonApprover = new ChairpersonApprover(); // 构建责任链:组长 -> 部门经理 -> 总经理 groupLeaderApprover.setNextApprover(departmentHead); departmentHead.setNextApprover(chairpersonApprover); // 开始审批流程 groupLeaderApprover.approve(leave); } }

结果

五、总结

责任链提供了一种处理请求的设计模式,请求可以沿着责任链传播,直到请求被处理。该设计模式具有灵活性可以根据需求改变链条处理类成员顺序,或者增加删除处理类。使用该模式可能会影响系统性能,而且出错调试困难。

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

AI培训:这不是又一个“割韭菜”风口,而是一个时代的基建革命

最近很多人问我怎么看现在满天飞的AI课&#xff0c;是不是割韭菜的又来了。我说&#xff0c;有些确实是&#xff0c;但更大的真相是&#xff1a;现在很多讲AI的人&#xff0c;根本不知道真正的复杂组织是怎么运作的。他们没做过实体项目&#xff0c;不懂生产线上的瓶颈在哪&…

作者头像 李华
网站建设 2026/5/1 16:05:42

YOLOv8 实战剪枝:L1 剪枝精度仅降 0.8%,推理速度暴涨 10.7 FPS!

剪枝后对比图: 文章目录 代码 原理介绍 核心做法概述 移植代码 下载yolov8代码 在工作根目录创建compress.py 创建ultralytics\models\yolo\detect\compress.py ultralytics\models\yolo\detect\compress.py 移植ultralytics\nn\extra_modules 移植ultralytics\cfg\hyp.scra…

作者头像 李华
网站建设 2026/5/13 3:27:39

RK3588 实战级 YOLOv5 Android 全解析:NPU 量化 + 多线程 + 跟踪算法,源码一次买齐

文章目录 一、项目概述与目标 为什么选择RK3588? 二、开发环境准备 硬件与软件配置 项目源码获取 三、快速上手:编译与运行 项目目录结构解析 一键运行 四、系统架构深度解析 核心挑战与解决方案 1. 相机集成挑战 2. 并发处理难题 3. 图像格式转换 4. 数据缓存管理 系统整体架…

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

从原理到落地:Mamba-YOLOv8 全面实战指南(源码 + 训练 + 部署一次学会)

文章目录前言一、技术背景与动机1.1 传统架构的局限性1.2 Mamba的创新优势二、Mamba-YOLOv8架构详解2.1 整体架构设计2.2 核心模块&#xff1a;VSSblock2.3 SS2D模块工作原理三、完整实现流程3.1 环境配置3.2 代码集成步骤3.3 训练与微调四、性能分析与优化4.1 精度提升策略4.2…

作者头像 李华
网站建设 2026/5/1 7:17:57

学习周报三十一

摘要 本周主要研究了两项关于多模态生成与扩散模型优化的前沿工作。深入分析了论文《ThinkDiff》&#xff0c;其核心创新在于通过视觉-语言训练作为代理任务&#xff0c;将视觉语言模型&#xff08;VLM&#xff09;与扩散解码器进行高效对齐&#xff0c;并利用随机掩码策略提升…

作者头像 李华