二十三种设计模式全面解析-解密职责链模式:请求处理的设计艺术
当我们构建软件系统时,经常会遇到需要处理各种不同类型请求的情况。有时,请求的处理逻辑可能相当复杂,需要按照一定的规则和条件进行处理。在本文中,我们将深入探讨职责链模式在请求处理中的应用。职责链模式通过将请求发送者和接收者解耦,构建一个处理者链条,使请求能够顺序经过不同的处理者进行处理。让我们一起探索这种设计模式的技术要点和适用场景,通过详细的案例代码来理解其实现方式。
详细案例代码:
假设我们正在设计一个请求处理系统,系统中有三种请求类型:日志请求、验证请求和授权请求。我们可以使用职责链模式来处理这些请求的逻辑。
首先,我们定义一个抽象处理者类和具体处理者类:
// 抽象处理者
abstract class RequestHandler {protected RequestHandler nextHandler;public void setNextHandler(RequestHandler nextHandler) {this.nextHandler = nextHandler;}public abstract void handleRequest(Request request);
}// 具体处理者
class LogRequestHandler extends RequestHandler {public void handleRequest(Request request) {if (request.getType() == RequestType.LOG) {System.out.println("Log request handled: " + request.getMessage());} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}class ValidationRequestHandler extends RequestHandler {public void handleRequest(Request request) {if (request.getType() == RequestType.VALIDATION) {System.out.println("Validation request handled: " + request.getMessage());} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}class AuthorizationRequestHandler extends RequestHandler {public void handleRequest(Request request) {if (request.getType() == RequestType.AUTHORIZATION) {System.out.println("Authorization request handled: " + request.getMessage());} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}
然后,我们定义一个请求类和职责链构建器类:
// 请求类
class Request {private RequestType type;private String message;public Request(RequestType type, String message) {this.type = type;this.message = message;}public RequestType getType() {return type;}public String getMessage() {return message;}
}// 请求类型枚举
enum RequestType {LOG,VALIDATION,AUTHORIZATION
}// 职责链构建器
class RequestChainBuilder {public RequestHandler build() {RequestHandler logHandler = new LogRequestHandler();RequestHandler validationHandler = new ValidationRequestHandler();RequestHandler authorizationHandler = new AuthorizationRequestHandler();logHandler.setNextHandler(validationHandler);validationHandler.setNextHandler(authorizationHandler);return logHandler;}
}
最后,我们在客户端中使用职责链模式处理请求:
public class Client {public static void main(String[] args) {RequestChainBuilder builder = new RequestChainBuilder();RequestHandler handler = builder.build();Request logRequest = new Request(RequestType.LOG, "Logging request");handler.handleRequest(logRequest);Request validationRequest = new Request(RequestType.VALIDATION, "Validation request");handler.handleRequest(validationRequest);Request authorizationRequest = new Request(RequestType.AUTHORIZATION, "Authorization request");handler.handleRequest(authorizationRequest);}
}
运行以上代码,输出结果将是:
Log request handled: Logging request
Validation request handled: Validation request
Authorization request handled: Authorization request
总结:
职责链模式的优雅之处在于它的可扩展性和灵活性。通过添加、移除或重新排序处理者,我们可以轻松地调整请求处理的流程。在真实的应用中,职责链模式经常与其他设计模式结合使用,例如装饰者模式、工厂模式等,以满足更复杂的需求。
下一篇文章中,我们将进一步揭示更多设计模式的奥秘。敬请期待!
好了,今天的分享到此结束。如果觉得我的博文帮到了您,您的点赞和关注是对我最大的支持。如遇到什么问题,可评论区留言。
相关文章:
二十三种设计模式全面解析-解密职责链模式:请求处理的设计艺术
当我们构建软件系统时,经常会遇到需要处理各种不同类型请求的情况。有时,请求的处理逻辑可能相当复杂,需要按照一定的规则和条件进行处理。在本文中,我们将深入探讨职责链模式在请求处理中的应用。职责链模式通过将请求发送者和接…...
【linux】安装telnet
Telnet Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令…...
深入探索 PaddlePaddle 中的计算图
**引言** 计算图是深度学习平台 PaddlePaddle 的核心组件之一,它提供了一种图形化的方式来表示和执行深度学习模型。通过了解和理解 PaddlePaddle 中的计算图,我们可以更好地理解深度学习的工作原理,并且能够更加灵活和高效地构建和训练复杂…...
西南科技大学814考研一
C语言基础 字节大小 char:1 字节 unsigned char:1 字节 short:2 字节 unsigned short:2 字节 int:通常为 4 字节(32 位平台)或 8 字节(64 位平台) unsigned int&#x…...
【网络编程】简述TCP通信程序,三次握手,四次挥手
文章目录 🎄TCP通信程序⭐打印字符串✨中文乱码问题🎈解决方法 🌺TCP三次握手🌺TCP四次挥手🛸其他 🎊专栏【网络编程】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆…...
【ARM Trace32(劳特巴赫) 使用介绍 5 -- Trace32 ELF 文件加载介绍】
请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 1.1 Trace32 加载符号表1.1.1 ELF 文件加载1.1.2 其它格式文件加载1.1.3 多个 ELF 的加载1.2 Trace32 UEFI 配置1.2.1 x86 32-BIT1.2.2 x86 64-BIT1.2.3 ARM1.1 Trace32 加载符号表 劳特巴赫 TRACE32 可以显示目标…...
Linux(4):Linux文件与目录管理
目录与路径 相对路径在进行软件或软件安装时非常有用,更加方便。利用相对路径的写法必须要确认目前的路径才能正确的去到想要去的目录。 绝对路径的正确度要比相对路径好,因此,在写程序(shell scripts)来管理系统的条…...
Altium Designer学习笔记2
原理图的绘制 需要掌握的是系统自带原理图库元件的添加。...
Atlassian发布最新补贴政策,Jira/Confluence迁移上云最低可至零成本
到2024年2月15日,Atlassian将不再提供对Jira、Confluence、Jira Service Management等Server版产品的支持。 近期,Atlassian推出了一项针对云产品的特殊优惠。现在从Server版迁移到云版,您能享受到高额补贴,甚至成本低至零元。立…...
基于FPGA的五子棋(论文+源码)
1.系统设计 在本次设计中,整个系统硬件框图如下图所示,以ALTERA的FPGA作为硬件载体,VGA接口,PS/2鼠标来完成设计,整个系统可以完成人人对战,人机对战的功能。系统通过软件编程来实现上述功能。将在硬件设计…...
QT5 MSVC2017 64bit配置OpenCV4.5无需编译与示范程序
环境:Windows 10 64位 Opencv版本:4.5 QT:5.14 QT5 MSVC2017配置OpenCV 版本参考: opencv msvc c对应版本 1.安装MSVC2017(vs2017) 打开Visual Studio Installer,点击修改 选择vs2017生成工…...
windows如何查看自己的ip地址
windows如何查看自己的ip地址 1.打开控制面板 2.进入网络和internet 3.进入网络共享中心 4.点击以太网进入网络详情页,或邮件已连接的网络,点击属性 5.查看ipv4地址就是当前机器ip...
Camera2的使用【详细】
目录 1.获取权限 2. 获取指定相机ID (1)获取相机管理者CameraManager (2)获取相机ID列表 (3)获取相机特征CameraCharacteristics (4)获取相机朝向 3.获取相机输出尺寸 (1)根据相机ID获取相机特征 (2)获取输出流配置StreamConfigurationMap (3)获取输出尺寸数组(参数为…...
Playcanvas后处理-辉光bloom
(一)Bloom介绍 Bloom(辉光、光晕、泛光)是一种常见的摄像机后处理(PostProcessing)效果,用于再现真实世界相机的成像伪影。这种效果会产生从图像中明亮区域边界延伸的光条纹(或羽毛…...
GCC 学习
GCC Resource Center for GCC Internalshttps://www.cse.iitb.ac.in/grc/这是个不错资料网站,有兴趣的可以了解下...
2023数维杯数学建模C题完整版本
已经完成全部版本,获取请查看文末下方名片 摘要 随着人工智能在多个领域的快速发展,其在文本生成上的应用引起了广泛关注。本研究聚焦于辨识人工智能(AI)生成文本的基本规则,并探究AI文本的检测及其与人类文本的区分…...
快速解密PPT幻灯片密码,让PPT重见天日
最简单的办法解密、找回和去除PPT幻灯片密码,具体步骤如下:1.百度搜索【密码帝官网】,2.点击“立即开始”在用户中心上传要解密的文件稍等片刻,就能找回密码。不用下载软件,手机电脑都可用。而且还支持Word、Excel、PD…...
十六、RabbitMQ快速入门
目录 一、在centos上下载MQ镜像 二、安装运行容器 三、登录进入MQ 1、添加一个新的用户 2、新建虚拟机 3、 为用户分配权限 四、RabbitMQ的基本概念 RabbitMQ中的几个概念: 五、常见消息模型 六、简单的消息生产与消费 1、消费者类 2、生产者类 3、基本消息队列的消…...
C#WPF用户控件及自定义控件实例
本文演示C#WPF自定义控件实例 用户控件(UserControl)和自定义控件(CustomControl)都是对UI控件的一种封装方式,目的都是实现封装后控件的重用。 只不过各自封装的实现方式和使用的场景上存在差异。 1 基于UserControl 创建 创建控件最简单一个方法就是基于UserControl …...
大模型的语言能力
NLP作为一个领域为基础模型开辟了道路。虽然这些模型在标准基准测试中占据主导地位,但这些模型目前获得的能力与那些将语言描述为人类交流和思维的复杂系统的能力之间存在明显的差距。针对这一点,我们强调语言变异的全部范围(例如,…...
douyin-downloader抖音下载器:如何高效批量下载去水印视频的完整指南
douyin-downloader抖音下载器:如何高效批量下载去水印视频的完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser …...
对比直连与通过Taotoken调用大模型的延迟与稳定性体验
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直连与通过Taotoken调用大模型的延迟与稳定性体验 在构建依赖大模型能力的应用时,开发者通常会面临一个选择&#…...
5分钟搞定网盘限速:免费开源下载助手终极指南
5分钟搞定网盘限速:免费开源下载助手终极指南 【免费下载链接】baiduyun 油猴脚本 - 一个免费开源的网盘下载助手 项目地址: https://gitcode.com/gh_mirrors/ba/baiduyun 还在为网盘下载速度慢如蜗牛而烦恼吗?每次下载大文件都要等待数小时甚至数…...
基于MCP协议构建大模型联网搜索工具:原理、实现与部署指南
1. 项目概述:一个连接大模型与真实世界的“搜索工具箱”如果你正在开发一个基于大模型(LLM)的应用,比如一个智能客服、一个文档分析助手,或者一个能帮你规划行程的AI伙伴,你可能会遇到一个核心痛点…...
Dify-Flow:企业级AI工作流编排的增强方案与工程实践
1. 项目概述:从Dify到Flow,AI应用编排的进阶之路如果你最近在关注AI应用开发,尤其是低代码/无代码的AI工作流构建,那么“Dify”这个名字你一定不陌生。它作为一个开源的LLM应用开发平台,让开发者能像搭积木一样&#x…...
Transkribus与ChatGPT结合:构建高效历史档案智能转录与校正工作流
1. 项目概述:当古老档案遇见现代AI历史档案研究,听起来是个充满灰尘和故纸堆的领域。作为一名长期在数字人文和档案数字化领域摸爬滚打的从业者,我深知其中的痛点:面对数百年前的手写文献,无论是花体英文、潦草的中文行…...
思维之树框架:用搜索算法提升大语言模型复杂推理能力
1. 项目概述:从“链式思考”到“思维之树”的跃迁 如果你已经玩过一阵子大语言模型,对“链式思考”肯定不陌生。简单来说,就是让模型在给出最终答案前,先一步步写下推理过程。这招对付数学题、逻辑谜题效果拔群,因为它…...
移动端视频帧插值技术:ANVIL框架与NPU优化实践
1. 移动端视频帧插值的技术挑战与ANVIL框架概述视频帧插值(Video Frame Interpolation, VFI)作为提升视频流畅度的关键技术,在移动设备上实现实时处理面临三重技术壁垒:首先是计算复杂度与功耗限制,传统光流法需要执行…...
slim-mcp:为AI Agent工具列表智能瘦身,节省70%上下文Token
1. 项目概述:为AI Agent“瘦身”的MCP代理如果你正在使用Claude Code、Cursor或者任何支持Model Context Protocol的AI助手,并且发现随着你安装的MCP服务器越来越多,工具列表长得让人眼花缭乱,甚至开始挤占宝贵的上下文窗口&#…...
哔哩下载姬DownKyi终极指南:3分钟掌握B站视频无损下载的完整教程
哔哩下载姬DownKyi终极指南:3分钟掌握B站视频无损下载的完整教程 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水…...
