尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

0127_责任链模式(Chain of Responsibility)

0127_责任链模式(Chain of Responsibility)
📅 发布时间:2026/6/19 16:53:02

责任链模式(Chain of Responsibility)

意图

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

UML 图

Chain

优点

  1. 降低耦合度:请求发送者不需要知道哪个对象处理请求
  2. 动态组合:可以动态地改变处理链中的对象或顺序
  3. 增强灵活性:可以灵活地分配职责,添加新的处理者很方便
  4. 简化对象:每个处理者只需关注自己的职责范围
  5. 可配置性:处理链可以在运行时进行配置

缺点

  1. 请求可能未被处理:如果链中没有合适的处理者,请求可能无法被处理
  2. 性能影响:较长的处理链可能会影响性能
  3. 调试困难:请求的处理过程可能分散在多个对象中,调试较复杂
  4. 循环引用风险:如果链配置不当,可能导致循环引用
  5. 顺序依赖性:处理者的顺序很重要,配置错误可能导致错误的行为

代码示例

以人类和机器人处理不同类型请求为例:

1. 处理者接口 (Handler Interface)

// 请求处理者接口
public interface RequestHandler {void handleRequest(Request request);void setNextHandler(RequestHandler nextHandler);boolean canHandle(Request request);String getHandlerName();
}// 请求类
public class Request {private String type;private String content;private int priority; // 优先级public Request(String type, String content, int priority) {this.type = type;this.content = content;this.priority = priority;}public String getType() { return type; }public String getContent() { return content; }public int getPriority() { return priority; }@Overridepublic String toString() {return "[" + type + "] " + content + " (优先级: " + priority + ")";}
}

2. 抽象处理者 (Abstract Handler)

// 抽象处理者
public abstract class AbstractHandler implements RequestHandler {protected RequestHandler nextHandler;protected String handlerName;@Overridepublic void setNextHandler(RequestHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handleRequest(Request request) {if (canHandle(request)) {System.out.println(handlerName + " 处理请求: " + request);processRequest(request);} else if (nextHandler != null) {System.out.println(handlerName + " 无法处理,传递给下一个处理者");nextHandler.handleRequest(request);} else {System.out.println("⚠️ 没有处理者能够处理此请求: " + request);}}protected abstract void processRequest(Request request);public abstract boolean canHandle(Request request);@Overridepublic String getHandlerName() {return handlerName;}
}

3. 具体处理者 (Concrete Handlers)

// 人类处理者 - 处理情感类请求
public class HumanHandler extends AbstractHandler {public HumanHandler() {this.handlerName = "👤 人类处理者";}@Overridepublic boolean canHandle(Request request) {return request.getType().equals("情感") || request.getType().equals("创意") ||request.getPriority() <= 3; // 处理低优先级请求}@Overrideprotected void processRequest(Request request) {if (request.getType().equals("情感")) {System.out.println("💖 人类正在提供情感支持: " + request.getContent());} else if (request.getType().equals("创意")) {System.out.println("🎨 人类正在发挥创造力: " + request.getContent());} else {System.out.println("👨‍💼 人类正在处理一般请求: " + request.getContent());}}
}// 机器人处理者 - 处理逻辑类请求
public class RobotHandler extends AbstractHandler {public RobotHandler() {this.handlerName = "🤖 机器人处理者";}@Overridepublic boolean canHandle(Request request) {return request.getType().equals("计算") || request.getType().equals("数据") ||request.getPriority() >= 7; // 处理高优先级请求}@Overrideprotected void processRequest(Request request) {if (request.getType().equals("计算")) {System.out.println("🧮 机器人正在执行计算任务: " + request.getContent());} else if (request.getType().equals("数据")) {System.out.println("📊 机器人正在处理数据: " + request.getContent());} else {System.out.println("⚡ 机器人正在处理紧急请求: " + request.getContent());}}
}// 系统处理者 - 处理系统类请求
public class SystemHandler extends AbstractHandler {public SystemHandler() {this.handlerName = "💻 系统处理者";}@Overridepublic boolean canHandle(Request request) {return request.getType().equals("系统") || request.getType().equals("错误");}@Overrideprotected void processRequest(Request request) {if (request.getType().equals("系统")) {System.out.println("🔧 系统正在执行维护任务: " + request.getContent());} else {System.out.println("❌ 系统正在处理错误: " + request.getContent());}}
}

4. 责任链构建器

// 责任链构建器
public class HandlerChainBuilder {public static RequestHandler buildDefaultChain() {RequestHandler human = new HumanHandler();RequestHandler robot = new RobotHandler();RequestHandler system = new SystemHandler();// 构建责任链: 人类 -> 机器人 -> 系统human.setNextHandler(robot);robot.setNextHandler(system);return human;}public static RequestHandler buildPriorityChain() {RequestHandler robot = new RobotHandler(); // 高优先级RequestHandler human = new HumanHandler(); // 低优先级RequestHandler system = new SystemHandler(); // 系统级// 构建责任链: 机器人 -> 人类 -> 系统robot.setNextHandler(human);human.setNextHandler(system);return robot;}
}

5. 客户端代码

public class ChainOfResponsibilityDemo {public static void main(String[] args) {System.out.println("=== 责任链模式演示 ===");// 构建默认责任链RequestHandler chain = HandlerChainBuilder.buildDefaultChain();// 创建各种类型的请求Request[] requests = {new Request("情感", "需要情感安慰", 2),new Request("计算", "复杂的数学计算", 8),new Request("系统", "系统备份任务", 5),new Request("创意", "设计新方案", 4),new Request("数据", "大数据分析", 9),new Request("未知", "未知类型请求", 1)};System.out.println("\n📋 处理请求序列:");for (Request request : requests) {System.out.println("\n--- 处理新请求 ---");chain.handleRequest(request);}System.out.println("\n=== 优先级责任链 ===");RequestHandler priorityChain = HandlerChainBuilder.buildPriorityChain();Request priorityRequest = new Request("一般", "普通请求但高优先级", 9);System.out.println("处理高优先级请求:");priorityChain.handleRequest(priorityRequest);System.out.println("\n=== 动态修改责任链 ===");// 动态添加新的处理者RequestHandler customChain = new HumanHandler();RequestHandler newRobot = new RobotHandler();RequestHandler newSystem = new SystemHandler();customChain.setNextHandler(newRobot);newRobot.setNextHandler(newSystem);Request customRequest = new Request("计算", "动态链测试", 6);customChain.handleRequest(customRequest);}
}

在Java标准库中的应用

责任链模式在Java标准库中的类似应用:

  1. Servlet过滤器链
// Servlet Filter 责任链
public interface Filter {void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
}// 过滤器链按顺序调用每个过滤器
  1. Java日志处理
// java.util.logging 包中的处理器链
Logger logger = Logger.getLogger("example");
logger.addHandler(new ConsoleHandler());
logger.addHandler(new FileHandler("log.txt"));
// 日志消息会依次经过每个处理器
  1. 异常处理
// 异常处理的责任链模式
try {// 可能抛出异常的代码
} catch (SpecificException e) {// 特定异常处理
} catch (GeneralException e) {// 一般异常处理
} catch (Exception e) {// 通用异常处理
}
  1. AOP拦截器链
// Spring AOP 中的拦截器链
public interface MethodInterceptor {Object invoke(MethodInvocation invocation) throws Throwable;
}
// 多个拦截器形成责任链处理方法的调用

总结

责任链模式通过将多个处理对象连接成一条链,让请求沿着这条链传递,直到有一个对象处理它为止。这种模式有效地解耦了请求发送者和接收者,使得多个对象都有机会处理请求,同时可以动态地组合和修改处理链。

在人类和机器人的例子中,我们可以看到不同类型的请求(情感、计算、系统等)被分配给最适合的处理者。人类擅长处理情感和创意类请求,机器人擅长处理计算和数据类请求,而系统处理者负责系统级别的任务。这种分工协作的方式既提高了处理效率,又保证了每个处理者都能专注于自己擅长的领域。

责任链模式特别适用于:

  • 有多个对象可以处理请求,但不确定哪个对象最适合
  • 需要动态指定处理请求的对象集合
  • 需要在不明确指定接收者的情况下向多个对象发送请求

相关新闻

  • Spatial 语言核心概念简介
  • spatial 一个芯片设计语言的简介 scala dsl 并行支持 -1
  • NVIDIA GPU调研: 访存通路设计

最新新闻

  • 昆明全品类贵金属回收指南,金价实时更新,线下靠谱门店汇总清单 - 奢侈品回收评测
  • 沪上贵金属变现干货汇总:2026 五大黄金回收连锁门店全维度评测 - 奢侈品回收测评
  • 从零开发Java面试刷题作战APP:架构重构、模块闭环、技术栈选型全方案
  • 洪湖上门回收黄金哪家放心 2026大盘行情与避坑全攻略 - 润富黄金回收
  • 曲靖哪里回收黄金靠谱 2026六月实测三家实体门店无套路 - 润富黄金回收
  • 2026苏州黄金回收门店梯队测评,个人闲置黄金变现优选与避雷完整指南 - 奢侈品交易观察员

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号