news 2026/6/10 15:48:55

设计模式——责任链模式

作者头像

张小明

前端开发工程师

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/6/10 14:41:00

接口还是慢,也许是你的表太规范了

当业务逻辑稍微复杂一点&#xff0c;也建立了合适的索引&#xff0c;可能仍然解决不好接口访问数据库时的性能问题。有时&#xff0c;为了遵循数据库第三范式而精心设计的表结构和JOIN查询&#xff0c;正成为新的性能瓶颈。 第一范式&#xff08;1NF&#xff09;要求表的每个格…

作者头像 李华
网站建设 2026/5/28 10:46:43

基于Labview的多设备通讯与过程控制项目分享

Labview和西门子PLC OPC通讯和仪器串口通信&#xff0c;和扫描枪通讯 使用中程序&#xff0c;有电气图纸&#xff0c;BOM&#xff0c;全套项目资料 温度曲线&#xff0c;压力曲线等Labview和西门子PLC smart200 OPC通讯仪器串口通讯 全套项目资料&#xff0c;包括Labview 程序&…

作者头像 李华
网站建设 2026/6/9 18:46:37

深度学习框架基于YOLOv11的无人机检测系统 高精度无人机智能监测系统 如何训练无人机检测数据集

基于YOLOv11的无人机检测系统 无人机Anti-UAV数据集 训练集5200、验证集2600、测试集2200 数据集配置文件 150epoch训练好的模型、训练结果 可调整置信度、交并比、可选择模型 也可自行替换模型&#xff0c;使用该界面做其他&#xff0c;实现检测目标自定义 完整源码源文件已…

作者头像 李华
网站建设 2026/6/10 15:05:05

LLM大语言模型困惑度深度研究报告

1. 理论基础与数学定义 1.1 困惑度的概念与直观解释 1.1.1 不确定性度量与模型"惊讶度" 困惑度(Perplexity, PPL)作为自然语言处理领域最核心的评估指标之一,本质上量化了语言模型在面对文本序列时的"惊讶程度"或不确定性水平。从信息论视角审视,当…

作者头像 李华
网站建设 2026/6/10 2:03:56

简单理解:三模冗余TMR

三模冗余&#xff08;Triple Modular Redundancy&#xff0c;TMR&#xff09;是一种经典的硬件容错技术&#xff0c;核心是通过 “三取二” 多数表决机制屏蔽单个模块故障&#xff0c;保障关键系统在极端环境下的高可靠运行&#xff0c;广泛用于航空航天、汽车电子、核电等领域…

作者头像 李华