Java设计模式:行为型模式→责任链模式

news2025/2/6 22:00:37

Java 责任链模式详解

1. 定义

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它使多个对象都有机会处理请求,而不是由一个对象去处理这个请求。这种模式以链表的形式将多个处理对象串联起来,并通过请求的传递寻找合适的处理对象进行处理。责任链模式的目的是将请求的发送者和接收者解耦,使得多个对象可以处理请求而不需要明确地指定处理者。

2. 基本思想

责任链模式的基本思想是将多个处理对象(责任链)组合在一起以形成一条链。一个请求沿着这条链传播,直到被某个处理者对象处理为止。通过这种方式,可以使请求的处理过程更灵活和动态。责任链使得对象之间可以灵活地连接,增强了系统的灵活性和可扩展性。

3. 基本原理

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

  • 处理者接口(Handler):定义一个处理请求的接口或抽象类,包含设置下一个处理者的方法。
  • 具体处理者(Concrete Handler):实现处理者接口,处理特定的请求。如果自己无法处理,请求会被转发给下一个处理者。
  • 客户端(Client):构建责任链并发送请求,客户端并不需要关心请求的具体处理者。
    在这里插入图片描述

更多实用资源:

http://sj.ysok.net/jydoraemon 访问码:JYAM

4. 实现方式

4.1 基本实现

4.1.1 处理者接口

定义处理者接口,包含对请求的处理和设置下一个处理者的方法:

public abstract class Handler {
    protected Handler nextHandler;

    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract void handleRequest(String request);
}
4.1.2 具体处理者

实现几个具体处理者,处理不同类型的请求:

public class ConcreteHandlerA extends Handler {
    @Override
    public void handleRequest(String request) {
        if (request.equals("A")) {
            System.out.println("Handled by ConcreteHandlerA");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

public class ConcreteHandlerB extends Handler {
    @Override
    public void handleRequest(String request) {
        if (request.equals("B")) {
            System.out.println("Handled by ConcreteHandlerB");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

public class ConcreteHandlerC extends Handler {
    @Override
    public void handleRequest(String request) {
        if (request.equals("C")) {
            System.out.println("Handled by ConcreteHandlerC");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}
4.1.3 客户端代码

客户端代码,构建责任链并发送请求:

public class Client {
    public static void main(String[] args) {
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        Handler handlerC = new ConcreteHandlerC();

        // 设置责任链
        handlerA.setNextHandler(handlerB);
        handlerB.setNextHandler(handlerC);

        // 测试请求
        handlerA.handleRequest("A"); // 处理 A 的请求
        handlerA.handleRequest("B"); // 处理 B 的请求
        handlerA.handleRequest("C"); // 处理 C 的请求
        handlerA.handleRequest("D"); // 没有处理者处理 D 的请求
    }
}

4.2 代码分析

  • 处理者接口(Handler):定义了处理请求的方法,并管理下一个处理者的引用,以形成链条。
  • 具体处理者(ConcreteHandlerA/B/C):实现了特定的请求处理逻辑,无法处理请求时将请求转发给下一个处理者。
  • 客户端:通过设置处理者并发送请求,测试责任链的处理效果。

5. 工作流程

  1. 定义处理者接口:创建一个接口或抽象类,定义处理请求的基本方法。
  2. 实现具体处理者:实现处理者接口的具体类,定义特定请求的业务逻辑。
  3. 设置责任链:在客户端中设置责任链,确定每个处理者的下一处理者。
  4. 发送请求:通过责任链的第一个处理者发送请求,由链条中的对象试图处理请求。

6. 变种

  1. 日志责任链:对请求的日志记录可以实现责任链,其中每个责任都负责不同的日志记录操作。
  2. 动态控制责任链:根据某些条件在运行时动态调整责任链的结构。

7. 实际应用

责任链模式在实际开发中具有广泛的应用,以下是一些典型的应用场景:

  1. 事件处理系统:在 GUI 框架中,鼠标事件、键盘事件的处理可以利用责任链模式。
  2. 审批流程:在多级审批系统中,责任链模式可以用来逐层处理审批请求,从而实现逐层审查。
  3. 过滤器链:在网络请求处理中,一个请求可能需要多个过滤器进行处理,可以采用责任链模式。

8. 使用场景

使用责任链模式的场景包括:

  • 当多个对象可以处理请求,而您希望自动顺序地处理请求时。
  • 当请求的发送者和接收者之间存在松散耦合时。
  • 当任何具体处理者都不需要清楚地知道是谁处理了请求。

9. 优缺点

优点

  1. 降低耦合性:发送者与接收者解耦,使代码更加灵活。
  2. 增强可扩展性:可以方便地增加或修改处理者,以改变处理链,适应业务的变化。
  3. 避免硬编码:不需要在代码中硬编码处理者的顺序,形成灵活调用的方式。

缺点

  1. 请求链逐级处理可能带来的性能问题:如果责任链过长,可能降低请求处理的效率。
  2. 调试困难:在调试时,跟踪请求的传递路径可能比较复杂。

10. 最佳实践

  1. 明确责任:每个处理者的职责应当明确,避免过度复杂化。
  2. 合理设计责任链:考虑处理者的顺序,确保能够有效地处理请求。
  3. 小心形成循环:确保责任链不会形成循环调用,避免引起无限循环。

11. 注意事项

  1. 使用合适的链条长度:避免设置过长的责任链,以保证请求能够被及时处理。
  2. 监控性能:要确保责任链的实现不会造成性能瓶颈。
  3. 文档化责任链:确保责任链的设计和实现都有良好的文档说明,以便于后续维护和理解。

12. 常见的误区

  • 责任链模式适合所有问题:并非所有场景都适合使用责任链模式,特别是处理单一请求的场合。
  • 认为责任链模式只有单一路径:责任链可以有多种不同的路径及流程,不必限制在一个简单线性结构。
  • 代理模式和责任链模式相似:两者不同,代理模式是对真实对象的控制,而责任链模式则是请求的处理路径。

13. 常见问题

  • 责任链模式的核心组成部分是什么?

    • 包括处理者接口、具体处理者、客户端和责任链的管理。
  • 如何判断使用责任链模式的适用性?

    • 当多个对象都可能处理一种请求,并希望跑出一个链来决定哪个负责时,可以使用责任链模式。
  • 责任链模式与其他设计模式的关系是什么?

    • 责任链模式可与其他模式(如策略模式)结合,实现灵活的请求处理。

14. 总结

责任链模式是一种有力的设计模式,主要用于构建灵活的请求处理机制,通过将多个处理方向串联起来,使请求能够由合适的处理者处理。通过引入责任链,代码之间能够松散耦合,从而增强了系统的可扩展性和可维护性。在实际应用中,合理运用责任链模式能够提升系统的架构设计,使得请求处理更加高效、灵活。理解责任链模式的基本原理、使用场景及优缺点,将有助于开发者根据需求制定合适的实现方案,并在复杂项目中取得更佳的效果。通过对责任链模式的深入了解,开发者能在高效开发和系统设计上获得更大的灵活性和自由度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2293970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2025年02月05日Github流行趋势

项目名称:OCRmyPDF 项目地址url:https://github.com/ocrmypdf/OCRmyPDF项目语言:Python历史star数:15872今日star数:157项目维护者:jbarlow83, fritz-hh, apps/dependabot, mawi12345, mara004项目简介&…

关于大数据

在大数据背景下存在的问题: 非结构化、半结构化数据:NoSQL数据库只负责存储;程序处理时涉及到数据移动,速度慢 是否存在一套整体解决方案? 可以存储并处理海量结构化、半结构化、非结构化数据 处理海量数据的速…

离散浣熊优化算法(DCOA)求解大规模旅行商问题(Large-Scale Traveling Salesman Problem,LTSP),MATLAB代码

大规模旅行商问题(Large-Scale Traveling Salesman Problem,LTSP)是经典旅行商问题(TSP)在规模上的扩展,是一个具有重要理论和实际意义的组合优化问题: 一、问题定义 给定一组城市和它们之间的…

Page Assist实现deepseek离线部署的在线搜索功能

前面文章Mac 基于Ollama 本地部署DeepSeek离线模型 实现了deepseek的离线部署,但是部署完成虽然可以进行问答和交互,也有thinking过程,但是没办法像官方一样进行联网搜索。今天我们介绍一款浏览器插件Page Assist来实现联网搜索,完…

win10系统安装和部署DeepSeek以及python实现

DeepSeek之python实现API应用 1、下载和安装 https://github.com/ollama/ollama/releases/latest/download/OllamaSetup.exe 傻瓜式安装 2、测试安装成功 ollama -v3、拉取模型 选择模型版本:1.5B 版本适合配置一般、想尝鲜、轻度使用的用户;8B 版本适合 16GB 内存以上…

C++六大默认成员函数

C六大默认成员函数 默认构造函数默认析构函数RAII技术RAII的核心思想优点示例应用场景 默认拷贝构造深拷贝和浅拷贝 默认拷贝赋值运算符移动构造函数(C11起)默认移动赋值运算符(C11起)取地址及const取地址操作符重载取地址操作符重…

3D图形学与可视化大屏:什么是片段着色器,有什么作用。

一、片段着色器的概念 在 3D 图形学中,片段着色器(Fragment Shader)是一种在图形渲染管线中负责处理片段(像素)的程序。它的主要任务是确定每个像素的颜色和其他属性,如透明度、深度等。片段着色器是可编程…

人类心智逆向工程:AGI的认知科学基础

文章目录 引言:为何需要逆向工程人类心智?一、逆向工程的定义与目标1.1 什么是逆向工程?1.2 AGI逆向工程的核心目标二、认知科学的四大支柱与AGI2.1 神经科学:大脑的硬件解剖2.2 心理学:心智的行为建模2.3 语言学:符号与意义的桥梁2.4 哲学:意识与自我模型的争议三、逆向…

低代码系统-产品架构案例介绍、蓝凌(十三)

蓝凌低代码系统,依旧是从下到上,从左至右的顺序。 技术平台h/iPaas 指低层使用了哪些技术,例如:微服务架构,MySql数据库。个人认为,如果是市场的主流,就没必要赘述了。 新一代门户 门户设计器&a…

Autosar-以太网是怎么运行的?(Davinci配置部分)

写在前面: 入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!! 目录 1.Autosar ETH通讯软件架构 2.Ethernet MCAL配置 2.1配置对应Pin属性 2.2配置TXD引脚 2.3配…

洛谷网站: P3029 [USACO11NOV] Cow Lineup S 题解

题目传送门: P3029 [USACO11NOV] Cow Lineup S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前言: 这道题的核心问题是在一条直线上分布着不同品种的牛,要找出一个连续区间,使得这个区间内包含所有不同品种的牛,…

STM32 ADC模数转换器

ADC简介 ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁 12位逐次逼近型ADC,1us转换时间 输入电压范围:0~3.3V&#xff0…

结合深度学习、自然语言处理(NLP)与多准则决策的三阶段技术框架,旨在实现从消费者情感分析到个性化决策

针对电商个性化推荐场景的集成机器学习和稳健优化三阶段方案。 第一阶段:在线评论数据处理,利用深度学习和自然语言处理技术进行特征挖掘,进而进行消费者情感分析,得到消费者偏好 在第一阶段,我们主要关注如何通过深度学习和自然语…

机器学习8-卷积和卷积核

机器学习7-卷积和卷积核 卷积与图像去噪卷积的定义与性质定义性质卷积的原理卷积步骤卷积的示例与应用卷积的优缺点优点缺点 总结 高斯卷积核卷积核尺寸的设置依据任务类型考虑数据特性实验与调优 高斯函数标准差的设置依据平滑需求结合卷积核尺寸实际应用场景 总结 图像噪声与…

SpringBoot使用 easy-captcha 实现验证码登录功能

文章目录 一、 环境准备1. 解决思路2. 接口文档3. redis下载 二、后端实现1. 引入依赖2. 添加配置3. 后端代码实现4. 前端代码实现 在前后端分离的项目中,登录功能是必不可少的。为了提高安全性,通常会加入验证码验证。 easy-captcha 是一个简单易用的验…

DIY Shell:探秘进程构建与命令解析的核心原理

个人主页:chian-ocean 文章专栏-Linux 前言: Shell(外壳)是一个操作系统的用户界面,它提供了一种方式,使得用户能够与操作系统进行交互。Shell 是用户与操作系统之间的桥梁,允许用户通过命令行…

数据库备份、主从、集群等配置

数据库备份、主从、集群等配置 1 MySQL1.1 docker安装MySQL1.2 主从复制1.2.1 主节点配置1.2.2 从节点配置1.2.3 创建用于主从同步的用户1.2.4 开启主从同步1.2.4 主从同步验证 1.3 主从切换1.3.1 主节点设置只读(在192.168.1.151上操作)1.3.2 检查主从数…

(回溯递归dfs 电话号码的字母组合 remake)leetcode 17

只找边界条件和非边界条件&#xff0c;剩下的交给数学归纳法就行&#xff0c;考虑子问题的重复性 [class Solution {vector<string>str { "","","abc","def","ghi","jkl","mno","pqrs"…

Redis --- 使用zset处理排行榜和计数问题

在处理计数业务时&#xff0c;我们一般会使用一个数据结构&#xff0c;既是集合又可以保证唯一性&#xff0c;所以我们会选择Redis中的set集合&#xff1a; 业务逻辑&#xff1a; 用户点击点赞按钮&#xff0c;需要再set集合内判断是否已点赞&#xff0c;未点赞则需要将点赞数1…

响应式编程_04Spring 5 中的响应式编程技术栈_WebFlux 和 Spring Data Reactive

文章目录 概述响应式Web框架Spring WebFlux响应式数据访问Spring Data Reactive 概述 https://spring.io/reactive 2017 年&#xff0c;Spring 发布了新版本 Spring 5&#xff0c; Spring 5 引入了很多核心功能&#xff0c;这其中重要的就是全面拥抱了响应式编程的设计思想和实…