当前位置: 首页 > ds >正文

Java设计模式-责任链模式

Java设计模式-责任链模式

责任链模式概述

设计模式(Design Pattern)是面向对象软件开发中经过验证的通用解决方案,用于解决特定场景下的高频问题。其本质是经验沉淀的代码设计模板,通过抽象和封装提高代码的可维护性、复用性和扩展性

我认为:设计模式是一类问题的通用解决方案。

设计模式按目的分类有三类

  • 创建型:控制对象创建过程
  • 结构型:优化类/对象的组合方式
  • 行为型:定义对象交互与职责分配

责任链模式就是其中的行为型的设计模式.

责任链模式简介

责任链模式

  • 责任链模式是一种行为型设计模式。

  • 通过将多个处理对象连接成链,允许请求沿链传递直至被处理。其核心在于解耦请求发送者与接收者,使多个对象都有机会处理请求,且处理路径由链结构动态决定

责任链模式的作用

  • 解耦性:请求者无需知道具体处理者,处理者无需知道请求来源
  • 动态扩展:运行时灵活增删处理节点或调整链顺序
  • 职责单一:每个处理者仅关注自身能处理的请求类型

责任链模式的应用场景

  • 日志处理系统(如本示例)

  • Web请求过滤链(Servlet Filter)

  • 审批流程(多级领导审批)

  • 异常处理机制(多层异常捕获)

课程目标

  • 理解责任链模式的核心思想和应用场景
  • 识别应用场景,独立实现责任链模式
  • 能够权衡模式的适用性

责任链模式的核心组件

角色职责

角色职责示例类名
Handler定义处理请求的接口,维护处理链引用Logger
ConcreteHandler实现具体处理逻辑,决定是否传递请求ConsoleHandler
Client构建处理链并触发请求LogManager

类图

implements
implements
implements
next
builds chain
«interface»
Handler
+Handler next
+handle(request)
ConsoleHandler
+handle(request)
FileHandler
+handle(request)
EmailHandler
+handle(request)
LogManager
+main()

传统设计方式 VS 责任链模式

案例需求

案例背景:

传统模式的实现

代码示例如下:

// 传统日志处理(强耦合)
class Logger {public void log(String level, String message) {if ("CONSOLE".equals(level)) {System.out.println("控制台输出:" + message);} else if ("FILE".equals(level)) {// 写入文件逻辑} else if ("SMS".equals(level)) {// 发送短信逻辑}}
}

传统模式的缺陷

  1. 新增日志类型需修改原有代码(违反开闭原则)
  2. 处理逻辑高度耦合,难以动态调整顺序
  3. 无法灵活组合不同处理策略

责任链模式的实现

责任链模式将修补传统实现方式的缺陷。

代码示例如下:

// 抽象处理器
abstract class Logger {protected Logger next;protected String level;public void setNext(Logger next) {this.next = next;}public void log(String msgLevel, String message) {if (this.level.compareTo(msgLevel) <= 0) {writeLog(message);}if (next != null) {next.log(msgLevel, message);}}abstract protected void writeLog(String message);
}// 控制台处理器
class ConsoleHandler extends Logger {public ConsoleHandler() {this.level = "CONSOLE";}@Overrideprotected void writeLog(String message) {System.out.println("[控制台] " + message);}
}// 文件处理器
class FileHandler extends Logger {public FileHandler() {this.level = "ERROR";}@Overrideprotected void writeLog(String message) {// 文件写入逻辑System.out.println("[文件] 写入ERROR日志:" + message);}
}// 短信处理器
class SmsHandler extends Logger {public SmsHandler() {this.level = "FATAL";}@Overrideprotected void writeLog(String message) {// 短信发送逻辑System.out.println("[短信] 发送FATAL报警:" + message);}
}// 客户端
public class LogManager {public static void main(String[] args) {Logger console = new ConsoleHandler();Logger file = new FileHandler();Logger sms = new SmsHandler();// 构建责任链:控制台 → 文件 → 短信console.setNext(file);file.setNext(sms);// 触发日志处理console.log("INFO", "系统正常运行");console.log("ERROR", "数据库连接失败");console.log("FATAL", "服务器宕机");}
}

责任链模式的优势

  1. 灵活扩展:新增日志处理器无需修改现有代码
  2. 动态配置:可通过配置文件调整处理链顺序
  3. 职责清晰:每个处理器专注特定日志级别处理

责任链模式的局限

  1. 性能损耗:长链可能导致请求传递延迟
  2. 调试复杂:链式调用增加问题定位难度
  3. 可能遗漏:若链中无匹配处理器,请求将被丢弃

模式变体

  • 静态链:通过配置文件定义处理顺序
  • 责任树:树形结构支持并行处理分支
  • 异步链:结合消息队列实现异步处理

最佳实践

  • 控制链长度:建议不超过7个节点(米勒法则)
  • 默认处理器:链尾设置兜底处理器防止遗漏
  • 日志追踪:添加链路ID实现请求跟踪
  • 性能优化:高频场景使用责任树代替单链

总结

通过责任链模式,我们成功构建了一个可动态扩展的日志处理系统,完美诠释了"开闭原则"和"单一职责原则"的设计哲学。这种模式特别适合需要多级协作但又不希望耦合度过高的场景。

http://www.xdnf.cn/news/17898.html

相关文章:

  • 【力扣】面试经典150题总结02-双指针、滑动窗口
  • 如何在 Spring Boot 中设计和返回树形结构的组织和部门信息
  • 在线 A2C实践
  • Transformer模型实现与测试梳理
  • 深入详解C语言的循环结构:while循环、do-while循环、for循环,结合实例,讲透C语言的循环结构
  • 免费专业PDF文档扫描效果生成器
  • 海洋通信系统技术文档(1)
  • uniapp授权登录
  • 比特币持有者结构性转变 XBIT分析BTC最新价格行情市场重构
  • 【计算机网络 | 第6篇】计算机体系结构与参考模型
  • TDengine IDMP 基本功能(4. 实时分析)
  • [QtADS]解析demo.pro
  • 【论文阅读笔记】Context-Aware Hierarchical Merging for Long Document Summarization
  • 【R语言】R语言的工作空间映像(workspace image,通常是.RData)详解
  • 《卷积神经网络(CNN):解锁视觉与多模态任务的深度学习核心》
  • 【完整源码+数据集+部署教程】火柴实例分割系统源码和数据集:改进yolo11-rmt
  • 【类与对象(下)】探秘C++构造函数初始化列表
  • 响应式对象的类型及其使用场景
  • WMware的安装以及Ubuntu22的安装
  • 11.用反射为静态类的属性赋值 C#例子 WPF例子
  • 第六十五章:AI的“精良食材”:图像标注、视频帧抽帧与字幕提取技巧
  • 数据挖掘常用公开数据集
  • 【KO】Android 网络相关面试题
  • Redis 核心数据结构与常用命令详解
  • Qwen-Image(阿里通义千问)技术浅析(二)
  • HTTP 协议详细介绍
  • 第6章 AB实验的SRM问题
  • elasticsearch mapping和template解析(自动分词)!
  • 何解决PyCharm中pip install安装Python报错ModuleNotFoundError: No module named ‘json’问题
  • Flink DataStream 按分钟或日期统计数据量