二十三种设计模式全面解析-解密职责链模式:请求处理的设计艺术


当我们构建软件系统时,经常会遇到需要处理各种不同类型请求的情况。有时,请求的处理逻辑可能相当复杂,需要按照一定的规则和条件进行处理。在本文中,我们将深入探讨职责链模式在请求处理中的应用。职责链模式通过将请求发送者和接收者解耦,构建一个处理者链条,使请求能够顺序经过不同的处理者进行处理。让我们一起探索这种设计模式的技术要点和适用场景,通过详细的案例代码来理解其实现方式。


详细案例代码:

假设我们正在设计一个请求处理系统,系统中有三种请求类型:日志请求、验证请求和授权请求。我们可以使用职责链模式来处理这些请求的逻辑。


首先,我们定义一个抽象处理者类和具体处理者类:

// 抽象处理者
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

总结:

职责链模式的优雅之处在于它的可扩展性和灵活性。通过添加、移除或重新排序处理者,我们可以轻松地调整请求处理的流程。在真实的应用中,职责链模式经常与其他设计模式结合使用,例如装饰者模式、工厂模式等,以满足更复杂的需求。


下一篇文章中,我们将进一步揭示更多设计模式的奥秘。敬请期待!


好了,今天的分享到此结束。如果觉得我的博文帮到了您,您的点赞和关注是对我最大的支持。如遇到什么问题,可评论区留言。


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

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

相关文章

win10家庭版系统远通过一根网线程连接另一台机器

用网线连接两个机器 打开cmd命令行 输入ipconfig,查看 复制 IPv4地址 打开 远程桌面 程序 点击连接 输入在另外一机器设置好的用户名和密码即可

docker打包chatpdf(自写)

docker打包上传 docker build -t kitelff/chatpdf:v0.1 .##修改镜像名字 docker tag c2c1a0eb4e08 kitelff/chatpdf:v0.1## push docker push kitelff/chatpdf:v0.1上传文件,测试效果

【brpc学习实战二】brpc client构建基本流程

client基本概念及学习指南 https://github.com/luozesong/brpc/blob/master/docs/cn/client.md 一、编写proto 这里与服务一致,实际开发中需要双端共同确定proto内容; 二、初始化channel rpc channel可以视为socket编程中的client对象 定义一个chan…

字符串统计

题目部分 题目字符串统计难度易题目说明给定两个字符集合,一个是全量字符集,一个是已占用字符集,已占用字符集中的字符不能再使用,要求输出剩余可用字符集。输入描述1. 输入一个字符串 一定包含,前为全量字符集 后的为…

BananaPi BPI-M6(Raspberry Pi 5) Android 平板电脑镜像测试温度

我已经在本文中介绍了 全新的Banana Pi BPI-M6,并讨论了其与Raspberry Pi 5的硬件特性比较。 然后我将 Android 平板电脑固件上传到 eMMC,从而使 Banana Pi 实际可用。一开始有点坎坷,但文章中有更多内容。 在另一台电脑上,一切都…

Arcgis小技巧【16】:ArcMap的那些功能在ArcGIS Pro里都去哪儿了?

有部分小伙伴现在已经用上了ArcGIS Pro,但可能还会有些不习惯。 一个很重要的原因,原来在ArcMap中的一些功能,好像在Pro里消失了。 不排除一些功能确实被移除了,但大部分其实是因为UI的变化,给放在了别的地方。 这里…

Linux CentOS7配置网络参数

CentOS6及以前版本中主要使用ifconfig工具,查看、配置网络参数。后来对推荐使用ip命令查看配置网络参数。而centos7中,不再赞成使用ifconfig工具,取而代之的是nmcli工具,服务管理也是以systemctl工具取代了service,这些之前版本的…

音视频项目—基于FFmpeg和SDL的音视频播放器解析(十二)

介绍 在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…

学霸教你自学人工智能

在这个信息爆炸的时代,人工智能已经渗透到我们生活的方方面面。无论是语音助手、自动驾驶汽车,还是医疗诊断,人工智能都在发挥着越来越重要的作用。如果你对人工智能充满热情,希望在这个领域有所建树,那么,…

基于深度学习的视觉三维重建研究总结

参考连接: 基于深度学习的视觉三维重建研究总结 - 知乎

微信私域运营工具CRM

为什么要做微信私域? 客户在哪里?微信!在中国,不论男女老少,90%的人每天使用微信至少5次,每次使用时间超过90分钟,已经成为像吃饭穿衣一样的生活必需品。因此,我们的目标客户就在微…

【github】初学者使用指南

作者:20岁爱吃必胜客(坤制作人),近十年开发经验, 跨域学习者,目前于新西兰奥克兰大学攻读IT硕士学位。荣誉:阿里云博客专家认证、腾讯开发者社区优质创作者,在CTF省赛校赛多次取得好成绩。跨领域…

简单选择排序

目录 基本原理举例示例代码总结简单选择排序 VS 堆排序简单选择排序 VS 冒泡排序 本文主要介绍简单选择排序的基本原理、具体例子,以及代码实现。 基本原理 简单选择排序的基本原理是: 在未排序序列中找到最小(大)元素&#xf…

一个奇怪的蓝牙模块分析记录

蓝牙标识PZ-BT11 从这个蓝牙通电后的表现可以看到有2个蓝牙,其中一个带有BLE标识,可能是一个双模蓝牙 首先这不是一个普通的JDY蓝牙, 因为普通JDY蓝牙只有1个蓝牙信号(从手机搜索蓝牙) 这可能是一个BLE蓝牙 因为B…

VMware——WindowServer2012R2环境mysql5.7.14解压版安装主从复制(图解版)

目录 一、服务器信息二、192.168.132.33主服务器上安装mysql(主)2.1、环境变量配置2.2、安装2.2.1、修改配置文件内容2.2.2、初始化mysql并指定超级用户密码2.2.3、安装mysql服务2.2.4、启动mysql服务2.2.5、登录用户管理及密码修改2.2.6、开启远程访问 …

Vue3 源码解读系列(七)——侦听器

侦听器 watch 侦听器是当侦听的对象或者函数发生了变化则自动执行某个回调函数。 侦听器的内部设计:侦听响应式数据的变化,内部创建 effect runner,首次执行 runner 做依赖收集,然后在数据发生变化后,以某种调度方式…

ESP32C3小飞控调试

ESP32C3小飞控调试 - 1 ESP32C3小飞控板赶在国庆节前发出打样,假期后上班就收到了样板,但是迟迟没有动手调试,这两天终于抽出时间调试了,调试过程还算顺利,基本没有遇到什么大问题,下面记录一下调试过程。…

什么是轻量应用服务器?腾讯云轻量服务器可以干什么?

腾讯云轻量应用服务器(TencentCloud Lighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,轻量应用服务器可用于搭建中小型网站、Web应用、博客、论坛、小程序/小游戏、电商、云盘/图床、云端开发测试和学习环境等轻量级、中低负载…

微信可以注册小号啦,看看怎么操作

微信支持同一手机号绑定两个账号啦! 生活号和工作号可以分开啦~实用又简单! 详细步骤如下: ①点击微信-我的-设置 ②点击“切换账号” ③点击“添加账号” ④点击“注册新账号” ⑤点击“通过当前微信的手机号辅助注册” ⑥安…

《 机器人基础 》期末试卷(A)

一、填空题(30分,每空2分) 1. 按照相机的工作方式,机器人常用相机分为1)__ 单目摄像头 2)__ 双目摄像头 _ 3)_深度摄像头_ 三类。 2. 度量地图强调…