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

责任链模式的理解和实践

        责任链模式(Chain of Responsibility)是行为型设计模式之一,它通过将多个对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。这个模式的主要目的是将请求的发送者和接收者解耦,使请求沿着处理链传递,直到被某个对象处理。本文将详细介绍责任链模式的理解和实践,并提供Java示例代码。

一、责任链模式的理解

定义与背景

        责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递。每个处理者对象都对请求进行某种形式的处理,然后决定是将请求传递给链中的下一个处理者对象,还是直接处理该请求。这种模式使得你可以在不明确指定请求处理对象的情况下,向多个对象发送请求。

主要角色

  • 抽象处理者(Handler):定义一个处理请求的接口,并包含一个后继者(successor)的引用,可以持有链中的下一个处理者对象。
  • 具体处理者(Concrete Handler):实现抽象处理者的接口,处理它所负责的请求。如果无法处理,则传递给后继者。
  • 客户端(Client):构建处理链,并向链中的第一个处理者发送请求。

工作原理

        责任链模式通过维护一个处理者对象的链表,使得每个对象都有机会处理请求。当一个请求被发送到链中的第一个处理者对象时,该对象会检查它是否能处理该请求。如果可以,则处理;如果不可以,则将该请求传递给链中的下一个处理者对象。这个过程一直持续到请求被某个对象处理为止,或者链的末端。

二、责任链模式的实践

        接下来,我们将通过Java代码来实现责任链模式。

  1. 定义抽象处理者

    首先,我们定义一个抽象处理者接口,该接口包含一个处理请求的方法和一个设置后继者的方法。

    public abstract class Handler {protected Handler successor;public void setSuccessor(Handler successor) {this.successor = successor;}public abstract void handleRequest(String request);
    }
  2. 实现具体处理者

    然后,我们实现几个具体处理者类,这些类将处理不同类型的请求。

    public class ConcreteHandler1 extends Handler {@Overridepublic void handleRequest(String request) {if (request.equals("Handler1")) {System.out.println("ConcreteHandler1 handled the request: " + request);} else {if (successor != null) {successor.handleRequest(request);}}}
    }public class ConcreteHandler2 extends Handler {@Overridepublic void handleRequest(String request) {if (request.equals("Handler2")) {System.out.println("ConcreteHandler2 handled the request: " + request);} else {if (successor != null) {successor.handleRequest(request);}}}
    }public class ConcreteHandler3 extends Handler {@Overridepublic void handleRequest(String request) {if (request.equals("Handler3")) {System.out.println("ConcreteHandler3 handled the request: " + request);} else {// This handler is the last in the chain, no successor to pass the request to}}
    }

  3. 构建处理链并发送请求

    最后,我们在客户端代码中构建处理链,并向链中的第一个处理者发送请求。

    public class Client {public static void main(String[] args) {Handler handler1 = new ConcreteHandler1();Handler handler2 = new ConcreteHandler2();Handler handler3 = new ConcreteHandler3();handler1.setSuccessor(handler2);handler2.setSuccessor(handler3);// Test requestshandler1.handleRequest("Handler1");handler1.handleRequest("Handler2");handler1.handleRequest("Handler3");handler1.handleRequest("Unknown");}
    }

  4. 运行结果

    运行客户端代码,你会看到以下输出:

    ConcreteHandler1 handled the request: Handler1
    ConcreteHandler2 handled the request: Handler2
    ConcreteHandler3 handled the request: Handler3

    对于未知请求("Unknown"),由于 ConcreteHandler3 是链中的最后一个处理者,并且它没有后继者,所以该请求不会被进一步处理。

三、责任链模式的优点与缺点

  1. 优点

    • 降低了耦合度:请求发送者和接收者之间解耦,发送者不需要知道接收者的具体实现。
    • 增强了灵活性:通过动态地改变链中的处理者,可以很容易地改变请求的处理流程。
    • 责任明确:每个处理者对象都明确知道它所负责处理的请求类型。
  2. 缺点

    • 性能问题:请求需要沿着链传递,直到被处理,这可能会增加系统的响应时间。
    • 调试困难:由于请求可能经过多个处理者对象,定位问题可能会变得复杂。
    • 链的构造:构建和维护处理链可能会比较复杂,特别是在处理者对象较多时。

四、应用场景

责任链模式适用于以下场景:

  • 事件处理系统:如GUI框架中的事件处理机制,事件沿着事件处理链传递,直到被某个处理器处理。
  • 审批流程:如请假审批流程,请求沿着审批链传递,直到被某个审批人批准或拒绝。
  • 过滤器机制:如Web应用中的过滤器链,请求和响应都沿着过滤器链传递,每个过滤器可以对请求和响应进行某种处理。

总结

        责任链模式通过将多个处理者对象连成一条链,并沿着这条链传递请求,直到请求被某个对象处理,从而实现了请求发送者和接收者之间的解耦。这种模式提高了系统的灵活性和可扩展性,但也带来了性能问题和调试困难。在实际应用中,我们需要根据具体场景和需求,权衡这些优缺点,决定是否使用责任链模式。

        通过本文的介绍和示例代码,相信你对责任链模式有了更深入的理解。希望这些知识和经验能够帮助你在实际开发中更好地应用该模式,设计出更加灵活和可维护的系统。

相关文章:

责任链模式的理解和实践

责任链模式(Chain of Responsibility)是行为型设计模式之一,它通过将多个对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。这个模式的主要目的是将请求的发送者和接收者解耦,使请求沿着处理链传…...

【大模型-向量库】详解向量库管理:连接管理、集合管理、向量管理

在向量数据库(Vector Database)中,向量库管理的概念是非常重要的,因为它涉及到如何高效地存储、索引和检索大规模的向量数据。向量库管理通常包括三个主要方面:连接管理、集合管理和向量管理。以下是对这三者的详细解释…...

MySQL书籍推荐

《高性能MySQL(第4版)》-西尔维亚博特罗斯 系统层次 Mysql性能优化和高可用架构实践 2020 系统基础 MySQL性能调优与架构设计 系统基础 Mysql技术大全 2021 综合 MySQL数据库应用案例教程 综合实战 从入门到项目实践 综合实战 丰富 超值 MySQ…...

常见的数据结构:

数据结构是计算机科学中的一个核心概念,它涉及到组织、管理和存储数据的方式,以便可以有效地访问和修改数据。数据结构的形式有很多,每种结构都有其特定的用途、优势和局限性。以下是一些常见的数据结构: 1. **数组(A…...

快速、高效的数据处理:深入了解 Polars 库

快速、高效的数据处理:深入了解 Polars 库 在数据科学和分析领域,Pandas 一直是 Python 数据处理的标杆。然而,随着数据量的增加,Pandas 在性能上的局限性逐渐显现。为了解决这一问题,越来越多的开发者开始寻找替代方…...

【LINUX】Linux 下打包与部署 Java 程序的全流程指南

文章目录 一、Java 程序打包1. 使用 Maven 打包2. 使用 Gradle 打包 二、运行 JAR 文件1. 前台运行2. 后台运行方法 1:使用 & 符号方法 2:使用 nohup 三、关闭运行中的程序1. 查找程序 PID2. 关闭程序 四、使用 Shell 脚本管理程序1. 创建 Shell 脚本…...

Spark 计算总销量

Spark 计算总销量 题目: 某电商平台存储了所有商品的销售数据,平台希望能够找到销量最好的前 N 个商品。通过分析销售记录,帮助平台决策哪些商品需要更多的推广资源。 假设你得到了一个商品销售记录的文本文件 product_id, product_name,…...

矩阵置零

矩阵置零 ​ 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff…...

Ai编程cursor + sealos + devBox实现登录以及用户管理增删改查(十三)

一、什么是 Sealos? Sealos 是一款以 Kubernetes 为内核的云操作系统发行版。它以云原生的方式,抛弃了传统的云计算架构,转向以 Kubernetes 为云内核的新架构,使企业能够像使用个人电脑一样简单地使用云。 二、适用场景 业务运…...

深度解读:生产环境中的日志优化与大数据处理实践20241116

🌟 深度解读:生产环境中的日志优化与大数据处理实践 在现代软件开发中,日志是系统调试与问题排查的重要工具。然而,随着应用的复杂化和数据量的增长,传统日志模块在应对复杂嵌套对象、大数据类型时可能面临性能问题和安…...

docker 搭建gitlab,亲测可用

1、Gitlab镜像 查找Gitlab镜像 docker search gitlab 拉取Gitlab镜像 docker pull gitlab/gitlab-ce:latest 2、启动Gitlab容器 # 启动容器 docker run \-itd \-p 9980:80 \-p 9922:22 \-v /home/gitlab/etc:/etc/gitlab \-v /home/gitlab/log:/var/log/gitlab \-v /ho…...

SpringBoot 分层解耦

从没有分层思想到传统 Web 分层,再到 Spring Boot 分层架构 1. 没有分层思想 在最初的项目开发中,很多开发者并没有明确的分层思想,所有逻辑都堆砌在一个类或一个方法中。这样的开发方式通常会导致以下问题: 代码混乱&#xff1…...

opencv复习

目录 1.core 1.图像变换 1.1 affine仿射变换 1.2 透视变换 2.四元数(旋转) 2.1 轴角转四元数 2.2 旋转矩阵转四元数 2.3 欧拉角转旋转矩阵 2.4 四元数转旋转矩阵 2.5 四元数用eigen用的比较多 2. imgproc. Image Processing 2.1 bilateralF…...

flask-socketio相关总结

flask-socketio是一个为flask应用程序添加的实时双向通信功能的扩展库,有了这个库,就可以在flask应用中应用websocket协议,帮助flask实现低延迟、双向的客户端、服务端通信。客户端通过任何SocketIO官方库,都能与服务器建立长连接…...

2024-12-03OpenCV图片处理基础

OpenCV图片处理基础 OpenCV的视频教学:https://www.bilibili.com/video/BV14P411D7MH 1-OpenCV摄像头读取 OpenCV使用摄像头读取图片帧,点击S保存当前帧到指定文件夹,点击Q关闭窗口,点击其他按钮打印按钮的值 要实现这个功能&…...

本地部署开源趣味艺术画板Paint Board结合内网穿透跨网络多设备在线绘画

文章目录 前言1.关于Paint Board2.本地部署paint-board3.使用Paint Board4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定Paint Board公网地址 前言 大家好,是不是每次想要在电脑上画画时,都被那些笨重的专业绘图软件搞得头大如斗呢?…...

iOS、android的app备案超简单的公钥、md5获取方法

很多云商的备案平台,推荐下载一些工具来获取公钥和MD5,但是这些工具的跨平台性不是很好,安装也十分麻烦,安装的时候还需要设置国内源等等。 这里,其实有在线工具可以获取APP的公钥和MD5、SHA1值这些信息的。不需要安装…...

SpringCloud 与 SpringBoot版本对应关系,以及maven,jdk

目录 SpringCloud 与 SpringBoot各版本的对应关系 方式一 Learn 方式二 OverView SpringBoot与JDK、maven 容器等对应关系 SpringCloud 与 SpringBoot各版本的对应关系 SpringCloudSpringBootFinchley2.0.xFinchley.SR1Spring Boot >=2.0.3.RELEASE and <=2.0.9RELEAS…...

23种设计模式之装饰模式

目录 1. 简介2. 代码2.1 ABatterCake &#xff08;抽象组件&#xff09;2.2 BatterCake &#xff08;具体组件&#xff09;2.3 ADecorator &#xff08;抽象装饰者&#xff09;2.4 EggDecorator &#xff08;具体装饰者&#xff09;2.5 SausageDecorator&#xff08;具体装饰者…...

HTMLHTML5革命:构建现代网页的终极指南 - 2. HTMLHTML5H5的区别

HTML&HTML5革命&#xff1a;构建现代网页的终极指南 2. HTML&HTML5&H5的区别 大家好&#xff0c;我是莫离老师 在上一节课&#xff0c;我们了解了HTML的重要性和前端开发的核心概念。 今天&#xff0c;我们将深入探讨 HTML、HTML5 和 H5 的区别&#xff0c;并重点…...

Django之ORM表操作

ORM表操作 1.ORM单表操作 首先想操作表的增删改查&#xff0c;需要先导入这个表,以之前创建的UserInfo表为例,在app下的views.py中导入 from app import modelsdef query(request):new_obj models.UserInfo(id1,name北北,bday2019-09-27,checked1,)new_obj.save()return Htt…...

python下几个淘宝、天猫、京东爬虫实例

以下是使用Python编写的针对淘宝、天猫、京东详情页的爬虫实例。请注意&#xff0c;这些实例仅供参考&#xff0c;实际使用时可能需要根据网站结构的变化进行调整&#xff0c;并且需要遵守各平台的爬虫协议和法律法规。 淘宝详情页爬虫实例 环境准备&#xff1a; Python 3.xSe…...

级联树结构TreeSelect和上级反查

接口返回结构 前端展示格式 前端组件 <template><div ><el-scrollbar height"70vh"><el-tree :data"deptOptions" :props"{ label: label, children: children }" :expand-on-click-node"false":filter-node-me…...

gradle下载慢解决方案2024 /12 /1android studio (Windows环境)

gradle下载慢解决方案2024 /12 /1 默认环境配置好了,环境配置和程序安装请出门右转 打开软件,点击右上角设置,找到如下设置页 选择本地安装并制定好你已经安装好的 gradle 应用保存即可 全局插件环境配置(新版本可以直接在设置中添加了) 找对应位置添加国内源并把前面的内置源…...

Python+OpenCV系列:GRAY BGR HSV

以下是 GRAY、BGR 和 HSV 三种色彩空间的对比&#xff0c;涵盖了它们的定义、特点、应用场景和优缺点&#xff1a; 1. 定义 GRAY&#xff1a; 灰度图像仅包含亮度信息&#xff0c;每个像素用一个值&#xff08;通常在0到255之间&#xff09;表示亮度&#xff08;黑到白&#x…...

丢垃圾视频时间检测 -- 基于状态机的实现

文章目录 OverviewKey PointsPseudo-code Overview 需要考虑的方面 状态定义和转换条件时序约束空间约束异常处理 状态机的设计需要考虑的场景&#xff1a; 没有人人进入人携带垃圾人离开但垃圾留下垃圾消失异常情况&#xff08;检测失败、多人多垃圾等&#xff09; Key P…...

【QT】一个简单的串口通信小工具(QSerialPort实现)

目录 0.简介 1.展示结果 1&#xff09;UI界面&#xff1a; 2&#xff09;SSCOM&#xff08;模拟下位机收发&#xff09;&#xff1a; 3&#xff09;VSPD虚拟串口驱动&#xff08;连接上位机和下位机的串口&#xff09;&#xff1a; 4&#xff09;实际收发消息效果及视频演…...

24/12/5 算法笔记<强化学习> doubleDQN,duelingDQN

我们前面了解了DQN网络的一些知识&#xff0c;然而DQN还有一些改进的方法&#xff0c;比如doubleDQN和duelingDQN,我们先来将一下doubleDQN和DQN. 先来对比一下 单一网络 vs. 双重网络 DQN:是一个深度神经网络来估计每个动作的Q值 DDQN:使用两个独立的深度神经网络&#xf…...

道可云人工智能元宇宙每日资讯|全国工商联人工智能委员会成立会议在南京举办

道可云元宇宙每日简报&#xff08;2024年12月5日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 全国工商联人工智能委员会成立会议在南京举办 全国工商联人工智能委员会成立会议日前在江苏省南京市举办。中央统战部副部长、全国工商联党组书记沈莹出席会议并讲话…...

MySQL数据库(2)-检查安装与密码重置

1. 数据库下载安装 下载地址&#xff1a;MySQL :: Download MySQL Community Server 2. My.ini配置文件 my.ini 文件通常在MySQL安装过程中自动创建&#xff0c; 并且可以根据需要进行编辑以调整服务器的行为。 3. 配置环境变量 4. 查询版本号 查询版本号&#xff1a;mysql…...