责任链模式学习进阶--一起学习吧之数据库

news/2025/1/21 10:43:48/

上一篇学习了责任链的基本定义和特点

https://mp.csdn.net/mp_blog/creation/editor?not_checkout=1&spm=1015.2103.3001.8012

本文继续对责任链模式进行深入学习

一、实现过程

责任链模式的实现过程可以分为以下几个步骤:

  1. 定义抽象处理者角色(Handler)
    首先,我们需要定义一个抽象的处理者角色。这个抽象角色定义了一个处理请求的接口,它通常包含一个指向下一个处理者的引用以及一个处理请求的方法。这样,每个处理者都可以将自己与链中的下一个处理者关联起来,并在必要时将请求传递给下一个处理者。

  2. 实现具体处理者角色
    接下来,我们需要实现具体的处理者角色。这些角色继承自抽象处理者,并实现了处理请求的具体逻辑。在处理请求的方法中,每个具体处理者首先会检查自己是否能够处理该请求。如果可以处理,就执行相应的逻辑;否则,将请求传递给链中的下一个处理者。

  3. 设置责任链
    创建责任链的过程就是将各个处理者按照某种顺序连接起来。这通常通过在创建处理者实例时,将每个处理者与其下一个处理者关联起来完成。链的头部通常是客户端发起请求的地方,而链的尾部则是一个能够处理所有请求的默认处理者或者是一个标识链结束的对象。

  4. 客户端发起请求
    客户端发起请求时,只需要将请求发送给责任链的头部。然后,头部处理者会根据自身的逻辑判断是否能够处理该请求。如果能够处理,则执行相应操作;否则,将请求传递给下一个处理者,直到链中的某个处理者能够处理该请求为止。如果链中的所有处理者都不能处理该请求,那么通常会有一个默认的处理者来执行某种默认操作或返回错误信息。

以下是一个简化的伪代码示例来说明责任链模式的实现过程:

# 抽象处理者角色  
class Handler:  def __init__(self, next_handler=None):  self.next_handler = next_handler  def handle_request(self, request):  # 判断当前处理者是否能处理该请求  if self.can_handle(request):  # 处理请求  self.process(request)  elif self.next_handler is not None:  # 传递给下一个处理者  self.next_handler.handle_request(request)  else:  # 没有处理者能处理该请求  print("No handler could process the request.")  def can_handle(self, request):  # 判断当前处理者是否能处理请求的逻辑  pass  def process(self, request):  # 处理请求的具体逻辑  pass  # 具体处理者角色A  
class HandlerA(Handler):  def can_handle(self, request):  # 判断逻辑,例如基于请求类型  return request.type == 'A'  def process(self, request):  # 处理请求A的逻辑  print("HandlerA processing request.")  # 具体处理者角色B  
class HandlerB(Handler):  def can_handle(self, request):  return request.type == 'B'  def process(self, request):  print("HandlerB processing request.")  # 客户端代码  
if __name__ == "__main__":  # 创建处理者链  handler_a = HandlerA()  handler_b = HandlerB(handler_a)  # HandlerB处理不了则传递给HandlerA  # 创建请求  request = Request(type='B')  # 发起请求  handler_b.handle_request(request)  # 请求从HandlerB开始传递

在上面的示例中,Handler 是抽象处理者角色,HandlerA 和 HandlerB 是具体处理者角色,它们分别处理不同类型的请求。Request 类表示请求对象,它包含请求的类型等信息。客户端创建了一个处理者链,并将请求发送给链的头部(handler_b)。如果 HandlerB 不能处理该请求,它会将请求传递给链中的下一个处理者(handler_a)。如果链中的所有处理者都不能处理该请求,则会打印出错误信息。 

二、适用场景

责任链模式的应用场景非常广泛,主要包括但不限于以下几个方面:

  1. 请求处理链:当系统中存在多个处理器,每个处理器负责不同的处理逻辑时,责任链模式非常适用。通过将这些处理器连接成一个处理链,每个请求按照处理链的顺序依次经过处理器进行处理,直到找到合适的处理器处理请求或者请求被拒绝。这种模式可以实现请求的动态处理和灵活的扩展,提高系统的可维护性和可扩展性。
  2. 日志记录:在一个系统中,经常需要对某些操作进行日志记录,以便后续的审计和问题排查。使用责任链模式,可以将日志记录的逻辑封装到多个处理器中,并按照一定的顺序组成一个责任链。当需要记录日志时,请求会沿着责任链传递,每个处理器都可以选择是否记录日志,以及记录日志的方式和内容。
  3. 异常处理:系统中可能会出现各种各样的异常情况,需要对这些异常进行处理。责任链模式可以将不同类型的异常处理逻辑分别封装到不同的处理器中,并按照一定的顺序组成一个责任链。当系统出现异常时,请求会沿着责任链传递,每个处理器都可以选择是否处理该异常,以及如何处理。
  4. 过滤器链:当需要对某个请求进行一系列的过滤操作时,责任链模式同样适用。每个过滤器负责执行一种过滤操作,如果某个过滤器无法处理,则将请求传递给下一个过滤器。
  5. 业务流程审批:在现实生活中,责任链模式的例子可以是请假审批流程。假设有多个层级的审批人员,每个人都有不同的审批权限。当员工提交请假申请时,请求会从最高层级的审批人员开始传递,如果一个审批人员无法处理请求,则将请求传递给下一个审批人员,直到有人能够处理为止。

总的来说,责任链模式适用于那些需要多个对象按照一定顺序处理同一请求的场景,特别是在处理逻辑复杂、需要动态扩展或灵活处理请求时,责任链模式能够展现出其独特的优势。

 

 


http://www.ppmy.cn/news/1424553.html

相关文章

国产32位高性价比单片机 XL32F003,最高64 K flash和8 K SRAM

XL32F003系列单片机是32 位 ARMCortex- M0 内核单片机,1.7 V~5.5 V宽工作电压,工作温度范围为-40 C~85 C。最高64 Kbytes flash和8 Kbytes SRAM存储器,主频最高32 MHz。有SOP8/SOP14/SOP16/TSSOP20/SSOP24/QFN20/QFN32多种封装可以选择。XL32…

python把字典值转成浮点型数据

python把字典值转成浮点型数据 1、流程 1、读完数据,转成字典 2、遍历字典,使用正则判断字典值是否为浮点型字符串 3、使用eval把字符串转成浮点型2、代码 """ @contact: 微信 1257309054 @file: test.py @time: 2024/4/19 18:30 @author: LDC ""…

记一次普通的单表查询sql优化,去掉文件排序

一现象: 有空观察了线上某个sql语句执行计划,发现在500多毫秒左右,打算进行下优化。 二步骤: 对查询列assessment_periodic_id、assessment_user_id、create_time添加了组合索引并指定了倒叙。加入create_time 使查询结果不需要在…

汽车充电桩充电效率的四大决定因素

随着电动汽车的快速普及,交流充电桩作为电动汽车的充电基础设施,其充电效率受到了广泛的关注。接下来,我们将深入探讨交流充电桩的充电效率,包括充电效率的定义、影响因素以及提升方法。 充电效率的定义 交流充电桩的充电效率指的…

web3项目自动连接小狐狸以及小狐狸中的各种“地址”详解

刚做web3的时候,比较迷糊的就是人们口中说的各种地址,小狐狸钱包地址,私钥地址,跳转地址,接口地址,交易地址,等等XX地址,常常感觉跟做链的同事们说话不在一个频道。 这一小节&#x…

ActiveMQ 任意文件上传漏洞复现

一、使用弱口令登陆 ​ 访问 http://ip:8161/admin/ 进入admin登陆页面,使用弱口令登陆,账号密码皆为 admin,登陆成功后,headers中会出现验证信息 ​ 如: Authorization: Basic YWRtaW46YWRtaW4 # 二、利用PUT协议上…

博客文章:AWS re:Invent 2023 新产品深度解析 - 第四部分

TOC 🌈你好呀!我是 是Yu欸 🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~ 🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长! 写在最前面 去年发布文章的一部分,由于内…

深度解析CSS clip-path属性:塑造网页元素的无界形态

在网页设计领域,CSS clip-path 属性犹如一把无形的剪刀,赋予设计师精准裁剪元素可视区域的能力。它通过定义一个路径来决定元素内容的显示范围,突破矩形边界的束缚,实现各种富有创意和动态变化的形状展示。本文将深入剖析 clip-pa…