news 2026/6/15 22:08:54

设计模式——责任链模式

作者头像

张小明

前端开发工程师

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/15 17:28:17

某市“十五五“地下综合管廊智能化运维管理平台建设全案解析:从数字孪生到信创适配的深度实践(WORD)

摘要&#xff1a;本文深度拆解某市"十五五"期间地下综合管廊智能化运维管理平台的完整建设方案&#xff0c;涵盖从微服务架构设计、BIMGIS数字孪生底座构建&#xff0c;到全栈信创适配与等保三级安全体系落地的全流程。针对管廊运维中"感知碎片化、预警滞后、应…

作者头像 李华
网站建设 2026/6/15 15:55:00

依赖注入(Provide/Inject)的深入理解

依赖注入&#xff08;Provide/Inject&#xff09;的深入理解 一、依赖注入的核心概念 依赖注入&#xff08;Dependency Injection, DI&#xff09;是一种软件设计模式&#xff0c;其核心思想是将组件所需的依赖通过外部传入&#xff0c;而非组件内部自行创建或管理。在前端框架…

作者头像 李华
网站建设 2026/6/15 18:00:29

三相霍尔电流传感器在变频驱动系统中的应用与技术分析

在工业自动化和新能源领域&#xff0c;变频驱动系统对电流的实时监测和反馈提出了严格要求。三相霍尔电流传感器凭借其高精度、宽频带和绝缘隔离特性&#xff0c;成为变频器、电梯曳引机和光伏逆变器等应用中的关键部件。本文将以AT4V H00系列为例&#xff0c;分析三相霍尔电流…

作者头像 李华