责任链模式:解耦请求处理的设计模式

1. 引言

在复杂的软件系统中,请求的处理往往需要多个处理者共同参与。如何将这些处理者有效地串联起来,同时又不让请求的发起者直接依赖于具体的处理者,是一个值得关注的问题。责任链模式(Chain of Responsibility Pattern)为解决这一问题提供了一种有效的方案,通过将请求沿链传递,使得多个处理者都有机会处理请求,最终处理请求的责任被动态决定。

2. 责任链模式的定义

责任链模式是一种行为型设计模式,它通过将请求的发送者和接收者解耦,将多个处理者按顺序串联起来形成一条“责任链”。当一个请求发送时,这条链上的每个处理者都有机会处理这个请求,直到请求被处理或达到了链的末尾。每个处理者仅需要关注自己能处理的请求类型,增强了系统的灵活性。

3. 适用场景

  • 当需要多个对象处理一个请求,但不想让请求的发送者与接受者之间产生强耦合时。
  • 当希望将处理逻辑解耦,通过配置改变处理链的顺序与组成时。
  • 当需要动态地指定请求的处理者时。

4. 结构

责任链模式主要包括以下角色:

  • 处理者接口(Handler):定义处理请求的接口,通常还包括设置下一个处理者的方法。
  • 具体处理者(ConcreteHandler):实现处理者接口,处理特定类型的请求。
  • 客户端(Client):发送请求的对象。

5. 示例代码

5.1 处理者接口

// 处理者接口
abstract class Handler {protected Handler nextHandler;public void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}public abstract void handleRequest(int request);
}

DiffCopyInsert

5.2 具体处理者

// 具体处理者A
class ConcreteHandlerA extends Handler {@Overridepublic void handleRequest(int request) {if (request < 10) {System.out.println("处理者A处理请求: " + request);} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}// 具体处理者B
class ConcreteHandlerB extends Handler {@Overridepublic void handleRequest(int request) {if (request < 20) {System.out.println("处理者B处理请求: " + request);} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}// 具体处理者C
class ConcreteHandlerC extends Handler {@Overridepublic void handleRequest(int request) {System.out.println("处理者C处理请求: " + request);}
}

DiffCopyInsert

5.3 客户端代码

public class ChainOfResponsibilityDemo {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(5);   // 处理者A处理请求handlerA.handleRequest(15);  // 处理者B处理请求handlerA.handleRequest(25);  // 处理者C处理请求}
}

DiffCopyInsert

6. 优缺点

6.1 优点

  • 松散耦合:请求发送者与处理者之间不直接耦合,提高了系统的灵活性。
  • 增强了可扩展性:可以动态添加或替换处理者而无需修改请求处理的逻辑。
  • 简化了请求的处理逻辑:每个类只需处理特定的请求,无需了解整个处理过程。

6.2 缺点

  • 可能造成无处理者的情况:如果没有合适的处理者处理请求,请求将会被丢失。
  • 请求的处理顺序难以追踪:责任链的动态性可能导致请求的处理过程难以追踪和调试。
  • 可能导致性能问题:在处理链很长的情况下,可能会有性能问题。

7. 总结

责任链模式是一种灵活且强大的设计模式,能够有效处理多个对象之间的请求,并减少发送者与接收者之间的耦合度。在实际开发中,合理运用责任链模式可以提高代码的可维护性和扩展性,特别是在需要处理复杂请求的场景中。它为开发者提供了一种良好的解耦方式,使得对象间的交互更加灵活,能够高效支持各种业务逻辑的处理。

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

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

相关文章

分布式数据库的发展历程与大规模应用的历史

分布式数据库技术经历了数十年的发展&#xff0c;从最初的理论研究到现今的广泛应用&#xff0c;逐渐成为应对海量数据和高并发需求的重要技术支撑。特别是在近20年里&#xff0c;分布式数据库的技术实现和应用场景不断丰富&#xff0c;已经成为互联网、大数据、云计算等现代产…

内容安全与系统构建加速,助力解决生成式AI时代的双重挑战

内容安全与系统构建加速&#xff0c;助力解决生成式AI时代的双重挑战 0. 前言1. PRCV 20241.1 大会简介1.2 生成式 Al 时代的内容安全与系统构建加速 2. 生成式 AI2.1 生成模型2.2 生成模型与判别模型的区别2.3 生成模型的发展 3. GAI 内容安全3.1 GAI 时代内容安全挑战3.2 图像…

Matplotlib可视化——三维图与莫比乌斯带可视化

实验名称 Matplotlib中的三维图绘制:莫比乌斯带的可视化 实验目标 三维的点和线三维轮廓图线框图和曲面图曲面三角形 举例:莫比乌斯带的可视化实验主要使用的Python库 名称版本简介Numpy1.19.5数组运算Matplotlib3.3.4数据可视化实验适用的对象 学习对象:本科学生、研究生…

clickhouse最佳实践(一):clickhouse千亿级日志系统单机到集群架构演进历程

clickhouse千亿级日志系统单机到集群架构演进历程 1. 初始阶段&#xff1a;单机部署2. 使用代理层3. 集群设计4. 数据迁移5. 监控和维护6.集群横向扩展 最佳实践系列文章持续完善中&#xff0c; 记录了业务系统从碰到瓶颈到迭代的过程 1. 初始阶段&#xff1a;单机部署 针对Cl…

ZeroNL2SQL:零样本 NL2SQL

发布于&#xff1a;2024 年 10 月 30 日 星期三 #RAG #NL2SQL # Zero-Shot 自然语言到 SQL&#xff08;NL2SQL&#xff09;的转换是一个重要的研究领域&#xff0c;它允许非技术用户轻松访问和分析数据&#xff0c;在商业智能、数据分析等领域具有广泛的应用前景。然而&#x…

前端部署指南:手把手教你部署 Vue 项目

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue篇专栏内容:Vue-部署项目 前言 嗨喽伙伴们大家好&#xff0c;我是依旧青山。作为一名前端开发工程师&#xff…

usb外设枚举不到怎么查

明明内核配置了cdc_acm&#xff0c;dmesg | grep acm也有&#xff0c;lsusb却看不到设备。 排查思路&#xff1a; 主机端&#xff1a; 1、设备树是否使能。 2、主模式和从模式是否配置正确。 设备端&#xff1a; 设备端有条件的话可以插入其它设备看&#xff0c;或者复位…

Vivo开奖了,劝退价。。

vivo 也开奖了&#xff0c;不过有小伙伴反馈是个劝退价&#xff0c;甚至不如隔壁的 oppo&#xff0c;要说这两家也是渊源颇深&#xff0c;一家是绿厂&#xff0c;一家是蓝厂&#xff0c;高管也都是早期步步高出来的。 给大家盘一下开奖的信息&#xff0c;方便大家横向做个对比&…

Python 的 Pygame 库来开发一个游戏

import pygame import random# 初始化 Pygame pygame.init()# 设置屏幕大小 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height))# 设置标题 pygame.display.set_caption("飞机大战")# 加载图片 player_img pyga…

WPF+MVVM案例实战(八)- 自定义开关控件封装实现

文章目录 1、案例运行效果2、项目准备2、功能实现1、控件模板实现2、控件封装1、目录与文件创建2、各文件功能实现3、开关界面与主窗体菜单实现1、开关界面实现2、主窗体菜单实现4、源代码获取1、案例运行效果 2、项目准备 打开项目 Wpf_Examples,新建ToggleButtonWindow.xma…

【深度学习中的注意力机制10】11种主流注意力机制112个创新研究paper+代码——交叉注意力(Cross-Attention)

【深度学习中的注意力机制10】11种主流注意力机制112个创新研究paper代码——交叉注意力&#xff08;Cross-Attention&#xff09; 【深度学习中的注意力机制10】11种主流注意力机制112个创新研究paper代码——交叉注意力&#xff08;Cross-Attention&#xff09; 文章目录 【…

安宝特案例 | AR技术在院外心脏骤停急救中的革命性应用

00 案例背景 在院外心脏骤停 (OHCA) 的突发救援中&#xff0c;时间与效率直接决定着患者的生命。传统急救模式下&#xff0c;急救人员常通过视频或电话与医院医生进行沟通&#xff0c;以描述患者状况并依照指令行动。然而&#xff0c;这种信息传递方式往往因信息不完整或传递延…

测试自动化工具的横向对比

MicroAgent&#xff1a;这个AI智能体一键写代码并且自动测试&#xff01;它比 Aider 更好吗&#xff1f; 待研究&#xff1a;https://blog.csdn.net/gitblog_00054/article/details/139541862 playright&#xff1a;这是一个python驱动的自动化框架&#xff0c;部署简单&#…

第八天: C语言深度探索:指针与函数的奥秘

1 字符指针与字符串处理 字符指针与数组的关系 在C语言中&#xff0c;字符串可以被视为字符数组。数组名可以看作是指向其第一个元素的指针。因此&#xff0c;我们可以使用相同类型的指针来访问数组中的每个元素。这种对应关系使得字符指针在处理字符串时显得特别方便。 c …

C++初阶——类与对象(上篇)

一、写在前面 类与对象是C不同于C语言的一个板块&#xff0c;内容很多&#xff0c;笔者把这部分分为三篇博客来讲解&#xff0c;希望能够帮助各位读者更容易地理解这些知识点。弄清楚这一部分之后&#xff0c;C就算是成功入门了。 二、面向过程和面向对象 C语言就是典型的面向…

Java如何实现PDF转高质量图片

大家好&#xff0c;我是 V 哥。在Java中&#xff0c;将PDF文件转换为高质量的图片可以使用不同的库&#xff0c;其中最常用的库之一是 Apache PDFBox。通过该库&#xff0c;你可以读取PDF文件&#xff0c;并将每一页转换为图像文件。为了提高图像的质量&#xff0c;你可以指定分…

论文略读:OneChart: Purify the Chart Structural Extraction via One Auxiliary Token

2024 旷视的work 图表解析模型 1 背景 对于之前的视觉语言模型&#xff0c;论文认为其有两点不足需要改进&#xff1a; 需要充分训练一个真正会看 chart 的 vision encoder单纯对文本输出算交叉熵损失&#xff0c;并不是最优的&#xff08;如上图所示&#xff0c;当ground-tr…

STM32CubeMX学习(三) SPI+DMA通信

STM32CubeMX学习&#xff08;三&#xff09; SPIDMA通信 一、简介二、新建STM32CubeMX项目并使用外部时钟三、SPI3配置四、相关代码五、测试 一、简介 本文将基于STM32F103RCT芯片介绍如何在STM32CubeMXKEIL5开发环境下进行SPIDMA通信。 操作系统&#xff1a;WIN10 x64硬件电…

iOS静态库(.a)及资源文件的生成与使用详解(OC版本)

引言 iOS静态库&#xff08;.a&#xff09;及资源文件的生成与使用详解&#xff08;Swift版本&#xff09;_xcode 合并 .a文件-CSDN博客 在前面的博客中我们已经介绍了关于iOS静态库的生成步骤以及关于资源文件的处理&#xff0c;在本篇博客中我们将会以Objective-C为基础语言…

Python爬虫:在1688上“拍立淘”——按图索骥的奇妙之旅

想象一下&#xff0c;你是一名古代的侦探&#xff0c;手中握着一张神秘的藏宝图&#xff0c;在1688的茫茫商品海洋中寻找与之匹配的宝藏。今天&#xff0c;我们将一起化身为代码界的“拍立淘”专家&#xff0c;使用Python爬虫技术&#xff0c;通过API接口按图搜索商品。准备好你…