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

责任链模式详解:实现请求处理的灵活解耦

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者与接收者之间的耦合。通过将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。

一,组成部分

责任链模式主要由以下几个部分组成:

  1. 抽象处理者(Handler):定义一个处理请求的接口,并且包含一个指向下一个处理者的引用。
  2. 具体处理者(Concrete Handler):实现抽象处理者的接口,处理它所负责的请求,如果不能处理则将请求传递给下一个处理者。
  3. 客户端(Client):向链上的具体处理者对象提交请求。

uml类图:
在这里插入图片描述

二,示例代码

以下是一个简单的责任链模式示例,展示了如何处理不同级别的日志信息。

// 抽象处理者
abstract class Logger {public static int INFO = 1;public static int DEBUG = 2;public static int ERROR = 3;protected int level;protected Logger nextLogger;public void setNextLogger(Logger nextLogger) {this.nextLogger = nextLogger;}public void logMessage(int level, String message) {if (this.level <= level) {write(message);}if (nextLogger != null) {nextLogger.logMessage(level, message);}}abstract protected void write(String message);
}// 具体处理者
class ConsoleLogger extends Logger {public ConsoleLogger(int level) {this.level = level;}@Overrideprotected void write(String message) {System.out.println("Standard Console::Logger: " + message);}
}class ErrorLogger extends Logger {public ErrorLogger(int level) {this.level = level;}@Overrideprotected void write(String message) {System.out.println("Error Console::Logger: " + message);}
}class FileLogger extends Logger {public FileLogger(int level) {this.level = level;}@Overrideprotected void write(String message) {System.out.println("File::Logger: " + message);}
}// 客户端
public class ChainPatternDemo {private static Logger getChainOfLoggers() {Logger errorLogger = new ErrorLogger(Logger.ERROR);Logger fileLogger = new FileLogger(Logger.DEBUG);Logger consoleLogger = new ConsoleLogger(Logger.INFO);errorLogger.setNextLogger(fileLogger);fileLogger.setNextLogger(consoleLogger);return errorLogger;}public static void main(String[] args) {Logger loggerChain = getChainOfLoggers();loggerChain.logMessage(Logger.INFO, "This is an information.");loggerChain.logMessage(Logger.DEBUG, "This is a debug level information.");loggerChain.logMessage(Logger.ERROR, "This is an error information.");}
}

三,优缺点

优点

  • 降低耦合度:请求发送者与多个处理者解耦。
  • 增强灵活性:可以动态地添加或修改处理链。
  • 职责分明:每个处理者只需关注自己的处理逻辑。

缺点

  • 不保证被处理:请求可能会沿着链传递,直到链的末端都没有处理。
  • 性能开销:如果链过长,可能会影响性能。

四,适用场景

  • 多个对象可以处理同一请求:但具体由哪个对象处理在运行时决定。
  • 需要动态指定处理者:可以在运行时动态地组合责任链。

五,总结

责任链模式通过将请求沿着处理链传递,实现了请求发送者与接收者的解耦。它适用于多个对象可以处理同一请求的场景,并且可以动态地调整处理链的结构。尽管责任链模式可能带来一些性能开销,但它在提高系统灵活性和可维护性方面有着显著的优势。


如果你对设计模式、软件架构、编程技巧等内容感兴趣,欢迎关注我们的同名微信公众号【技术拾光者】。在这里,我们将定期分享最新的技术文章和实用的编程技巧,帮助你不断提升自己的技术水平。

扫描下方二维码,立即关注我们吧!
技术拾光者

感谢你的阅读和支持,我们期待与你在微信公众号上交流更多有趣的技术话题!


http://www.mrgr.cn/news/29197.html

相关文章:

  • Ubuntu22.04 安装mysql8 无法修改端口及配置的问题 坑啊~~~~
  • 关于深度学习的一些工具安装与细节
  • 【JAVA毕业设计】基于Vue和SpringBoot的宠物咖啡馆平台
  • SCUI Admin + Laravel 整合
  • ESLint 使用教程(四):ESLint 有哪些执行时机?
  • 《实时流计算系统设计与实现》-Part 2-笔记
  • 独孤思维:踩中红利,你也赚不到钱
  • 11111
  • 03-Mac系统PyCharm主题设置
  • C++ | Leetcode C++题解之第414题第三大的数
  • 调试、开发板、串口、Vitis、源码。
  • 一个高效使用AI产品的小技巧
  • 鸿蒙 ArkUI组件三
  • 浅谈C#之SynchronizationContext
  • 【python版】示波器输出的csv文件(时间与电压数据)如何转换为频率与幅值【方法⑤】
  • Docker常用命令大全
  • 【RabbitMQ】RabbitMQ 概述
  • python爬虫之json模块和jsonpath模块(5)
  • 【30天玩转python】网络编程基础
  • python爬虫之正则表达式(3)
  • java日志框架之JUL(Logging)
  • JavaScrip中的this、作用域代码输出题
  • 深入理解Redis:缓存穿透、缓存击穿、缓存雪崩及双写一致性
  • 【乐企-业务篇】乐企前置条件规则枚举
  • 基于Qt的串口调试工具串口常见问题
  • NASA:ATLAS/ICESat-2 L3 A陆地冰高度,版本6