Python编码系列—Python责任链模式:打造灵活的请求处理流程

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。

🚀 探索专栏:学步_技术的首页 —— 持续学习,不断进步,让学习成为我们共同的习惯,让总结成为我们前进的动力。

🔍 技术导航:

  • 人工智能:深入探讨人工智能领域核心技术。
  • 自动驾驶:分享自动驾驶领域核心技术和实战经验。
  • 环境配置:分享Linux环境下相关技术领域环境配置所遇到的问题解决经验。
  • 图像生成:分享图像生成领域核心技术和实战经验。
  • 虚拟现实技术:分享虚拟现实技术领域核心技术和实战经验。

🌈 非常期待在这个数字世界里与您相遇,一起学习、探讨、成长。不要忘了订阅本专栏,让我们的技术之旅不再孤单!

💖💖💖 ✨✨ 欢迎关注和订阅,一起开启技术探索之旅! ✨✨

文章目录

  • 1. 背景介绍
  • 2. 原理
      • 使用场景
      • 代码样例
      • 实际应用案例
      • 总结
      • 结语

1. 背景介绍

在复杂的软件系统中,经常需要通过多个处理器(或过滤器)来处理同一个请求,每个处理器完成自己的任务后,将请求传给下一个处理器。责任链模式(Chain of Responsibility Pattern)提供了一种优雅的方式来实现这种处理流程。本文将深入探讨Python中的责任链模式,包括其背景、原理、使用场景、代码实现和实际应用案例。

责任链模式是一种行为型设计模式,它允许一个请求沿着一个链条(或链表)的处理器传递,直到有一个处理器处理它为止。这种模式在处理不同类型的请求时非常有用,如权限验证、日志处理、错误处理等。
在这里插入图片描述

2. 原理

责任链模式的核心原理包括:

  • 定义处理器接口:定义一个处理器接口,包含处理请求和设置下一个处理器的方法。
  • 实现具体处理器:实现处理器接口,完成具体的处理逻辑。
  • 构建责任链:将多个处理器连成一条链,每个处理器在完成自己的处理后,将请求传递给链中的下一个处理器。

责任链模式通过将请求的发送者和接收者解耦,将这些请求连成一条链,使得请求可以沿着链被传递,直到有一个处理器处理它为止。这种模式增强了系统的灵活性和扩展性。下面详细探讨责任链模式的核心原理:

定义处理器接口
处理器接口是责任链模式的基础,它定义了每个处理器必须实现的方法,通常是handle_request方法用于处理请求,以及set_successor方法用于设置链中的下一个处理器。这个接口确保了链中所有的处理器都遵循相同的协议。

class Handler:def __init__(self, successor=None):self._successor = successordef handle_request(self, request):raise NotImplementedError("Handle request method must be implemented.")def set_successor(self, successor):self._successor = successor

在这个例子中,Handler类定义了处理器接口,其中包含handle_requestset_successor方法。

实现具体处理器
具体处理器实现了处理器接口,并提供了处理请求的具体逻辑。每个具体处理器在完成自己的处理工作后,需要决定是否将请求传给链中的下一个处理器。

class ConcreteHandlerA(Handler):def handle_request(self, request):if self.can_handle(request):print(f"Handler A handles the request: {request}")else:self.pass_to_next_successor(request)def can_handle(self, request):return request.startswith("A")def pass_to_next_successor(self, request):if self._successor:self._successor.handle_request(request)

在这个例子中,ConcreteHandlerA类实现了handle_request方法,它首先检查自己是否可以处理请求,如果可以,则处理请求;如果不可以,则调用下一个处理器的handle_request方法。

构建责任链
责任链的构建是通过将多个具体处理器对象链接起来实现的。每个处理器对象持有对下一个处理器的引用。当一个请求到来时,链中的每个处理器有机会处理该请求,如果当前处理器不处理,则请求会传给链中的下一个处理器。

# 客户端代码
handler_a = ConcreteHandlerA()
handler_b = ConcreteHandlerB()
handler_a.set_successor(handler_b)request = "AXYZ"
handler_a.handle_request(request)  # Handler A handles it.

在这个例子中,我们创建了两个具体处理器handler_ahandler_b,并通过调用set_successor方法将它们连接成一条责任链。

通过这些核心原理,责任链模式允许请求在多个处理器之间传递,直到找到合适的处理器为止。这种模式在实际应用中非常广泛,特别是在需要通过多个过滤器或处理器处理请求的场景中。

使用场景

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

  1. 多个对象处理同一个请求:如权限检查、日志记录、事务处理等。
  2. 处理请求的处理器动态确定:处理器的选择可以根据运行时的情况动态确定。

代码样例

以下是一个Python中实现责任链模式的示例:

class Handler:def __init__(self, successor=None):self._successor = successordef set_successor(self, successor):self._successor = successordef handle_request(self, request):if self._successor:self._successor.handle_request(request)else:print(f"End of chain, no handler found for {request}")class ConcreteHandlerA(Handler):def handle_request(self, request):if request == "A":print(f"Handler A handles request {request}")else:super().handle_request(request)class ConcreteHandlerB(Handler):def handle_request(self, request):if request == "B":print(f"Handler B handles request {request}")else:super().handle_request(request)# 客户端代码
if __name__ == "__main__":handler_a = ConcreteHandlerA()handler_b = ConcreteHandlerB()handler_a.set_successor(handler_b)handler_a.handle_request("A")handler_a.handle_request("B")handler_a.handle_request("C")

实际应用案例

假设我们正在开发一个Web应用,需要处理用户请求的不同阶段,如权限验证、日志记录、请求处理等。我们可以使用责任链模式来实现这一需求。

class Request:def __init__(self, user, resource):self.user = userself.resource = resourceclass LoggerHandler(Handler):def handle_request(self, request):print(f"LoggerHandler logs request from {request.user} for {request.resource}")super().handle_request(request)class AuthHandler(Handler):def handle_request(self, request):if not request.user.auth:print(f"AuthHandler denies access for {request.user}")else:super().handle_request(request)class ResourceHandler(Handler):def handle_request(self, request):print(f"ResourceHandler processes request for {request.resource}")# 客户端代码
if __name__ == "__main__":logger = LoggerHandler()auth = AuthHandler()resource = ResourceHandler()logger.set_successor(auth)auth.set_successor(resource)request = Request(user="User1", resource="Resource1")logger.handle_request(request)

总结

责任链模式是一种非常实用的设计模式,它通过将请求的传递和处理解耦,使得请求的处理更加灵活和可扩展。这种模式在处理复杂的请求处理流程时非常有用,如Web应用的请求处理、错误处理等。

结语

设计模式是软件设计中的艺术,责任链模式作为其中的一种,为我们提供了一种灵活的方式来处理请求。希望本文能够帮助你在Python项目中更好地应用责任链模式,提升代码的质量和灵活性。

🌟 在这篇博文的旅程中,感谢您的陪伴与阅读。如果内容对您有所启发或帮助,请不要吝啬您的点赞 👍🏻,这是对我最大的鼓励和支持。

📚 本人虽致力于提供准确且深入的技术分享,但学识有限,难免会有疏漏之处。如有不足或错误,恳请各位业界同仁在评论区留下宝贵意见,您的批评指正是我不断进步的动力!😄😄😄

💖💖💖 如果您发现这篇博文对您的研究或工作有所裨益,请不吝点赞、收藏,或分享给更多需要的朋友,让知识的力量传播得更远。

🔥🔥🔥 “Stay Hungry, Stay Foolish” —— 求知的道路永无止境,让我们保持渴望与初心,面对挑战,勇往直前。无论前路多么漫长,只要我们坚持不懈,终将抵达目的地。🌙🌙🌙

👋🏻 在此,我也邀请您加入我的技术交流社区,共同探讨、学习和成长。让我们携手并进,共创辉煌!
在这里插入图片描述

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

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

相关文章

华为开源自研AI框架昇思MindSpore应用案例:计算高效的卷积模型ShuffleNet

如果你对MindSpore感兴趣,可以关注昇思MindSpore社区 ShuffleNet ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型,和MobileNet, SqueezeNet等一样主要应用在移动端,所以模型的设计目标就是利用有限的计算资源来达到…

解决VRM格式模型在Unity中运行出现头发乱飞等问题

1、问题 通过VRoidStudio制作导出的vrm格式的模型,放在unity中使用时,一运行就会出现头发乱飞,没有自然下垂的问题 2、解决方法 将模型下的secondary中的所有VRM Spring Bone脚本中的Drag Force改为1,Hit Radius改为0 修改后…

自定义注解加 AOP 实现服务接口鉴权以及内部认证

注解 何谓注解? 在Java中,注解(Annotation)是一种特殊的语法,用符号开头,是 Java5 开始引入的新特性,可以看作是一种特殊的注释,主要用于修饰类、方法或者变量,提供某些信…

基于定制开发与2+1链动模式的商城小程序搭建策略

摘要:本文探讨商城小程序的搭建策略,对比自主组建团队和第三方开发两种方式,强调以第三方开发模式为主的优势。阐述在第三方开发模式下,结合定制开发和21链动模式,如何搭建一款有助于企业商业模式创新与智能商业升级的…

【韩顺平Java笔记】第5章:程序控制结构

文章目录 102. 回顾上一章节103. 顺序控制103.1 顺序控制 104. 单分支使用104.1 分支控制 if-else 介绍104.2 单分支 105. 单分支流程图106. 双分支使用107. 双分支流程图108. 双分支练习题109. 多分支使用109.1 多分支的流程图 110. 多分支练习1111. 多分支练习2112. 嵌套分支…

大数据-151 Apache Druid 集群模式 配置启动【上篇】 超详细!

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

网络通信——OSPF协议(基础篇)

这里基础是因为没有讲解OSPF中的具体算法过程,以及其中很多小细节。后续会更新。 目录 一.OSPF的基础信息 二.认识OSPF中的Router ID 三.OSPF中的三张表 四.OSPF中的度量方法(计算开销值) 五. OSPF选举DR和BDR(就是这个区域…

Leetcode3295. 举报垃圾信息

Every day a Leetcode 题目来源:3295. 举报垃圾信息 解法1:哈希 将字符串数组 bannedWords 的字符串保存在一个哈希表里。 遍历字符串数组 message 的每一个字符串 mes,如果 mes 在哈希表中出现,count。 如果 count > 2&a…

剪刀面的做法

1 面和水称重准备好,鸡蛋敲孔流入面粉中两个蛋清。 2 边下水边和面,每次下水不要太多,这是和硬面要注意的,下水多,水用完了,面还没和起来,一边揉面一边搓面盆周围,这样可以使盆光&a…

WebRTC入门

主要参考资料: WebRTC 在 ESP32 系列硬件平台上的实现: https://www.bilibili.com/video/BV1AEHseWEda/?spm_id_from333.337.search-card.all.click&vd_sourcedd284033cd0c4d1f3f59a2cd40ae4ef9 火山 RTC豆包大模型,给用户体验装上银色子弹: https:…

python的内存管理机制

python的内存管理机制主要分为三个部分:引用计数、垃圾回收和内存池机制。 引用计数机制: python通过维护每个对象的引用计数来跟踪内存中的对象。当对象被创建时就会有一个引用计数,当对象不再被使用时,引用计数为0&#xff0c…

SSE的使用

文章目录 SSE的使用前提需求SSE简介使用demo客户端(HTML)服务端 SSE API常用方法:事件:自定义关联事件: 服务端数据处理 SSE的使用 前提需求 web开发过程中需要前后端进行实时数据或者定时数据推送的需求中&#xff…

WebSocket消息防丢ACK和心跳机制对信息安全性的作用及实现方法

WebSocket消息防丢ACK和心跳机制对信息安全性的作用及实现方法 在现代即时通讯(IM)系统和实时通信应用中,WebSocket作为一种高效的双向通信协议,得到了广泛应用。然而,在实际使用中,如何确保消息的可靠传输…

websocket集群部署遇到的一些事

最近刚好有个场景,业务处理一份报告需要关注实时处理的进度。 本来打算使用前端轮训方式,但是考虑到这样效率比较低,也无法精确知道处理进度,就想到用websocket和前端实时交互,进度有更新就通知前端,避免了…

2022年6月 Frontier 获得性能第一的论文翻译

为百万兆级加速架构做高性能 Linpack 优化 摘要 我们详细叙述了在 rocHPL 中做的性能优化,rocHPL 是 AMD 对 HPL 基准的开源实现,主要是针对节点进行优化的架构,是为百万兆级系统而设计的,比如:Frontier suppercomput…

SpringCloud源码:服务端分析(二)- EurekaServer分析

背景 从昨日的两篇文章:SpringCloud源码:客户端分析(一)- SpringBootApplication注解类加载流程、SpringCloud源码:客户端分析(二)- 客户端源码分析。 我们理解了客户端的初始化,其实…

windows 录音编码为flv格式时,pcm采样格式

这里使用的是0x3e,转换为二进制: 0 0 1 1 1 1 1 0 前四个字节为3,表示Linear Pcm, 后4个字节1 1 1 0 表示44100HZ采样, 16个bit,单声道。 故,windows 音频采样不支持48000HZ频率

c++11~c++20 内联命名空间

在工作&#xff0c;我们经常会引入第三方库&#xff0c;偶尔会碰到同名的函数和类型&#xff0c;造成编译冲突的问题。一般我们可以使用命名空间&#xff0c;例如 #include <iostream> #include <iostream> using namespace std;namespace S1 {void foo(){cout &l…

css3-----2D转换、动画

2D 转换&#xff08;transform&#xff09; 转换&#xff08;transform&#xff09;是CSS3中具有颠覆性的特征之一&#xff0c;可以实现元素的位移、旋转、缩放等效果 移动&#xff1a;translate旋转&#xff1a;rotate缩放&#xff1a;scale 二维坐标系 2D 转换之移动 trans…

VR视频怎样进行加密和一机一码的使用?--加密(一)

在视频加密领域&#xff0c;我们常见接触的就是在普通设备上使用的加密视频&#xff0c;如电脑、手机、平板等。Vr的发展和兴起给人们带来最真实的体验感受&#xff0c;不仅在游戏行业应用较广&#xff0c;在一些影院或者元宇宙文旅、展厅等视频场景也备受青睐。 随着VR视频场景…