news 2026/4/30 21:50:26

设计模式——责任链模式

作者头像

张小明

前端开发工程师

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

责任链模式 (Chain of Responsibility Pattern)

什么是责任链模式?

责任链模式是一种行为型设计模式,它允许你将请求沿着处理者链传递,直到有一个处理者能够处理该请求。

简单来说:责任链模式就是"踢皮球",一个处理不了就传给下一个。

生活中的例子

想象一下:

  • 审批流程:员工请假 → 部门经理 → 人事经理 → 总经理
  • 客服系统:一级客服 → 二级客服 → 技术支持
  • 异常处理:try → catch → finally

为什么需要责任链模式?

传统方式的问题

// 使用if-else处理if(level==1){manager1.handle();}elseif(level==2){manager2.handle();}elseif(level==3){manager3.handle();}

问题

  1. 代码臃肿:大量if-else导致代码臃肿
  2. 难以扩展:新增处理者需要修改代码
  3. 耦合度高:客户端与所有处理者耦合

责任链模式的优势

// 使用责任链handler1.setNext(handler2);handler2.setNext(handler3);handler1.handle(request);

优势

  1. 解耦合:发送者和接收者解耦
  2. 灵活扩展:可以灵活地添加或删除处理者
  3. 动态组合:可以动态地组合处理者链

责任链模式的结构

┌─────────────────────┐ │ Handler │ 处理者接口 ├─────────────────────┤ │ - next: Handler │ │ + setNext(): void │ │ + handle(): void │ └──────────┬──────────┘ │ 继承 ├──┬──────────────────┬──────────────┐ │ │ │ ┌──────────┴──────┐ ┌───────────┴───────┐ ┌───┴────────┐ │ ConcreteHandler1│ │ ConcreteHandler2 │ │ ... │ 具体处理者 ├─────────────────┤ ├───────────────────┤ ├────────────┤ │ + handle() │ │ + handle() │ │ │ └─────────────────┘ └───────────────────┘ └────────────┘

代码示例

1. 定义处理者接口

/** * 抽象处理者:请假审批 */publicabstractclassLeaveApproval{protectedLeaveApprovalnext;protectedStringname;publicLeaveApproval(Stringname){this.name=name;}publicvoidsetNext(LeaveApprovalnext){this.next=next;}/** * 处理请假请求 * @param days 请假天数 */publicabstractvoidhandle(intdays);}

2. 定义具体处理者

/** * 具体处理者:主管 */publicclassSupervisorextendsLeaveApproval{publicSupervisor(Stringname){super(name);}@Overridepublicvoidhandle(intdays){if(days<=3){System.out.println(name+"批准了"+days+"天的请假");}elseif(next!=null){next.handle(days);}else{System.out.println("无人能处理"+days+"天的请假");}}}/** * 具体处理者:经理 */publicclassManagerextendsLeaveApproval{publicManager(Stringname){super(name);}@Overridepublicvoidhandle(intdays){if(days<=7){System.out.println(name+"批准了"+days+"天的请假");}elseif(next!=null){next.handle(days);}else{System.out.println("无人能处理"+days+"天的请假");}}}/** * 具体处理者:总监 */publicclassDirectorextendsLeaveApproval{publicDirector(Stringname){super(name);}@Overridepublicvoidhandle(intdays){if(days<=14){System.out.println(name+"批准了"+days+"天的请假");}elseif(next!=null){next.handle(days);}else{System.out.println("无人能处理"+days+"天的请假");}}}/** * 具体处理者:CEO */publicclassCEOextendsLeaveApproval{publicCEO(Stringname){super(name);}@Overridepublicvoidhandle(intdays){if(days<=30){System.out.println(name+"批准了"+days+"天的请假");}else{System.out.println("无人能处理"+days+"天的请假");}}}

3. 使用责任链

/** * 责任链模式测试类 * 演示如何使用责任链模式处理请假审批 */publicclassChainOfResponsibilityTest{publicstaticvoidmain(String[]args){System.out.println("=== 责任链模式测试 ===\n");// 创建处理者LeaveApprovalsupervisor=newSupervisor("主管");LeaveApprovalmanager=newManager("经理");LeaveApprovaldirector=newDirector("总监");LeaveApprovalceo=newCEO("CEO");// 设置责任链supervisor.setNext(manager);manager.setNext(director);director.setNext(ceo);// 测试不同天数的请假System.out.println("--- 请假1天 ---");supervisor.handle(1);System.out.println("\n--- 请假3天 ---");supervisor.handle(3);System.out.println("\n--- 请假7天 ---");supervisor.handle(7);System.out.println("\n--- 请假15天 ---");supervisor.handle(15);System.out.println("\n--- 请假35天 ---");supervisor.handle(35);System.out.println("\n=== 责任链模式的优势 ===");System.out.println("1. 解耦合:发送者和接收者解耦");System.out.println("2. 灵活扩展:可以灵活地添加或删除处理者");System.out.println("3. 动态组合:可以动态地组合处理者链");System.out.println("4. 简化代码:简化客户端代码");System.out.println("\n=== 实际应用场景 ===");System.out.println("1. 审批流程:请假审批、报销审批");System.out.println("2. 异常处理:异常处理链");System.out.println("3. 日志处理:日志处理链");System.out.println("4. 事件处理:事件处理链");}}

责任链模式的优点

  1. 解耦合:发送者和接收者解耦
  2. 灵活扩展:可以灵活地添加或删除处理者
  3. 动态组合:可以动态地组合处理者链
  4. 简化代码:简化客户端代码

责任链模式的缺点

  1. 性能问题:请求可能沿着链传递多次
  2. 调试困难:难以追踪请求的处理过程
  3. 链断裂:如果链断裂,请求可能无法被处理

适用场景

  1. 多个处理者:有多个对象可以处理请求
  2. 不确定处理者:不确定哪个对象可以处理请求
  3. 动态指定:需要动态指定处理者

常见应用场景

  • 审批流程:请假审批、报销审批
  • 异常处理:异常处理链
  • 日志处理:日志处理链

使用建议

  • 多个处理者:使用责任链模式
  • 不确定处理者:使用责任链模式
  • 单一处理者:直接使用即可

注意事项

⚠️ 责任链模式虽然有用,但要注意:

  • 不要让链太长,影响性能
  • 确保链不会断裂
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 21:50:18

VMware Skyline Health Diagnostics 4.0.11 - 自助式诊断与健康检查平台

VMware Skyline Health Diagnostics 4.0.11 - 自助式诊断与健康检查平台 适用于 VMware vSphere、vSAN、VCF 和 SD-WAN 产品的健康诊断 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-skyline-health-diagnostics/ 查看最新版。原创作品&#xff0c;转载请保留出…

作者头像 李华
网站建设 2026/4/30 21:49:53

立体防护,主动出击:华为云HSS为云上资产筑起“铜墙铁壁”

云时代&#xff0c;企业数字化高歌猛进&#xff0c;主机安全却如履薄冰。从工业巨头遭勒索攻击导致敏感数据泄露、供应链断裂&#xff0c;到各类挖矿病毒、窃密木马频发&#xff0c;再到漏洞风险激增、等保合规要求持续收紧……传统安全手段依赖特征库、响应滞后&#xff0c;在…

作者头像 李华
网站建设 2026/4/30 21:49:54

基于LLM的多智能体系统的博弈论视角

大型语言模型&#xff08;LLM&#xff09;已展现出强大的推理、规划和交流能力&#xff0c;使其能在开放环境中作为自主智能体运行。 尽管单智能体系统在适应性与协同性方面仍存在局限&#xff0c;但近期研究进展已将关注点转向由多个交互式大语言模型组成的多智能体系统&#…

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

ArcGIS Pro 从入门到实战基础篇(21):新建报表

在 GIS 项目中&#xff0c;除了地图成果&#xff0c;统计表和文字化结果同样非常重要。 在 ArcGIS Pro 中&#xff0c;报表用于将要素属性以表格形式进行整理、统计和输出&#xff0c;常用于成果汇总、数据核查和项目汇报。 ArcGIS Pro 中的报表是什么 通俗的讲&#xff0c;…

作者头像 李华
网站建设 2026/4/23 19:07:22

免疫组化试剂盒在现代病理诊断中有何关键作用?

一、免疫组化试剂盒如何实现精准的抗原-抗体检测&#xff1f;免疫组化试剂盒是一种经过系统化设计和标准化生产的检测系统&#xff0c;其核心原理基于抗原-抗体的特异性结合反应。整套系统通常包含经过优化的抗体试剂、信号放大系统、显色底物及配套缓冲液等关键组分。在工作流…

作者头像 李华
网站建设 2026/4/26 12:54:23

流式抗体的选择与优化策略为何重要?

一、如何根据实验目标科学选择流式抗体&#xff1f;流式抗体作为流式细胞术的核心试剂&#xff0c;其合理选择直接决定实验结果的准确性与可靠性。在进行选择前&#xff0c;研究者需明确以下关键参数&#xff1a;首先需确认靶标蛋白的细胞定位&#xff0c;区分其为细胞表面抗原…

作者头像 李华