Python-责任链模式

介绍

责任链模式是一种行为型设计模式,它允许多个对象以链式的形式依次处理请求,直到请求被处理或者无处理对象为止

实现方式

责任链模式由多个处理器组成,每个处理器都可以处理一种请求。如果当前处理器无法处理请求,它将把请求传递给下一个处理器,直到请求被处理或者没有处理器可以处理为止。

案例

假设我们正在开发一个电子商务平台,现在需要实现一个购物车功能。当用户添加商品到购物车中时,需要进行以下验证

  • 商品是否存在
  • 商品库存是否充足
  • 商品是否已经下架

我们可以使用责任链模式来实现这个购物车功能。首先定义一个处理器基类

class CartValidator:
    def __init__(self, next_validator=None):
        self.next_validator = next_validator

    def validate(self, item):
        if self.next_validator:
            return self.next_validator.validate(item)
        return True

这个基类包含了一个next_validator属性,表示后继处理器,以及一个validate方法,用于验证商品是否合法。如果存在后继处理器,则将验证请求传递给后继处理器。

接下来,我们可以定义三个具体的验证处理器,分别验证商品是否存在、商品库存是否充足以及商品是否已经下架

# 模拟
is_product_exist = True  # 判断商品是否存在
is_product_stock_enough = True  # 判断商品库存是否充足
is_product_on_sale = True  # 判断商品是否已经下架


class ProductExistValidator(CartValidator):
    def validate(self, item):
        # 判断商品是否存在
        # if not is_product_exist(item):
        if not is_product_exist:
            print('商品不存在')
            return False
        return super().validate(item)


class ProductStockValidator(CartValidator):
    def validate(self, item):
        # 判断商品库存是否充足
        # if not is_product_stock_enough(item):
        if not is_product_stock_enough:
            print('库存不足')
            return False
        return super().validate(item)


class ProductStatusValidator(CartValidator):
    def validate(self, item):
        # 判断商品是否已经下架
        # if not is_product_on_sale(item):
        if not is_product_on_sale:
            print('商品已下架')
            return False
        return super().validate(item)


product_validator_chain = ProductExistValidator(ProductStockValidator(ProductStatusValidator()))


def add_to_cart(item):
    if product_validator_chain.validate(item):
        # 添加商品到购物车中
        # add_item_to_cart(item)
        print("添加成功", item)
        pass
    else:
        # 商品验证失败
        print("商品验证失败")

这三个处理器都继承自CartValidator类,并覆盖了validate方法,实现了具体的商品验证逻辑。如果商品验证通过,则调用super()
.validate(item)方法,将验证请求传递给下一个处理器。

最后,我们可以将这三个处理器组成一个责任链:

product_validator_chain = ProductExistValidator(ProductStockValidator(ProductStatusValidator()))

测试
正常测试

add_to_cart("IPhone14 pro")

输出结果

添加成功 IPhone14 pro

库存不足测试

# 模拟库存不足
is_product_stock_enough = False
add_to_cart("IPhone14 pro")

输出结果

库存不足
商品验证失败

使用场景

多个对象需要处理同一种请求,但处理的顺序和方式不同。例如,一个在线商店需要对订单进行风险评估,评估过程包括多个步骤,如检查订单是否来自欺诈用户、检查收货地址是否存在风险等。每个步骤可以使用一个处理器来处理,这些处理器可以组成一个责任链,对订单进行逐步风险评估。

对象不知道该由哪个处理器处理请求,需要动态确定处理器。java中的web框架的过滤器,需要根据请求的URL来选择合适的处理器,处理器可以根据自身能力来决定是否能够处理请求。

动态扩展。在系统中需要动态添加或删除处理器,同时保证请求可以被正确处理。例如,一个安全检查系统需要根据系统的安全策略来动态添加或删除安全检查处理器,同时保证请求可以被正确处理。

以上就是对责任链模式的介绍,后面还会介绍更多的设计模式。


欢迎关注,学习不迷路!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 小型项目大全 11~15

十一、标题党生成器 原文:http://inventwithpython.com/bigbookpython/project11.html 我们的网站需要欺骗人们去看广告!但是想出有创意的原创内容太难了。幸运的是,有了标题党生成器,我们可以让一台计算机产生数百万个令人发指的…

【Linux】浅析Input子系统

文章目录1. 框架1.1 数据结构1.2 evdev_handler1.3 evdev_init1.4 input_register_handler2. 应用如何打开节点并读取到事件数据2.1 evdev_fops2.2 evdev_open2.3 evdev_release2.4 evdev_read2.5 evdev_write2.6 evdev_poll2.7 evdev_fasync2.8 evdev_ioctl2.9 evdev_ioctl_co…

[考研数据结构]第3章之栈的基本知识与操作

文章目录 栈的基本概念 栈的实现 顺序栈 共享栈 链栈 栈的基本概念 栈的定义 栈(Stack)是只允许在一端进行插入或删除操作的线性表 相关术语 栈顶(Top)线性表允许进行插入或删除的那一端称之为栈顶栈底(Bottom&…

【计算机网络-数据链路层】集线器、网桥、交换机

本文许多文字和图片使用了湖科大教书匠(高军老师)的 PPT,在此表示感谢。正是他让非科班的我能以奇妙的方式走进网络的世界。 文章目录1 【物理层】集线器(Hub)——共享式以太网1.1 为什么使用集线器?1.2 集…

macOS Monterey 12.6.5 (21G531) Boot ISO 原版可引导镜像

本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 2023 年 4 月 10 日(北京…

ESXI 6.7全面系统教程~汇总

ESXI 6.7全面系统教程 许可证:0A65P-00HD0-375M1-M097M-22P7H esxi 是一个脱机系统,也是一个虚拟机系统与vmware 相比,它可以直接运行在硬件上,这样可以减少资源浪费,一般用于服务器上;下面是esxi 的完整…

stable-diffusion-webui-colab部署记录

stable-diffusion-webui-colab 该模型可以在网上云端部署stable-diffusion,减少本地部署的繁琐步骤降低配置要求的依赖。 一、进入stable-diffusion-webui-colab 1.网址:https://github.com/camenduru/stable-diffusion-webui-colab 在分支中选择driv…

我的创作纪念日:Unity CEO表示生成式AI将是Unity近期发展重点,发布神秘影片预告

PICK 未来的AI技术将会让人类迎来下一个生产力变革,这其中也包括生成型AI的突破性革新。各大公司也正在竞相推出AIGC工具,其中微软的Copilot、Adobe的Firefly、Github的chatGPT等引起了人们的关注。然而,游戏开发领域似乎还没有一款真正针对性…

Vulnhub:Digitalworld.local (Development)靶机

kali:192.168.111.111 靶机:192.168.111.130 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --scripthttp-enum 192.168.111.130 查看网站首页源码 访问development目录,提示存在一个流量包 查看流量包发现另一个网站路径:/devel…

java继承类怎么写

继承类是通过把父类的方法和属性继承到一个类中,而子类的方法和属性是子类自己定义的。 Java中有一个很重要的概念叫做继承,这也是 Java语言的精髓所在。Java语言提供了一种机制,叫做派生类。在 Java中,如果没有实现了某个派生类方…

python 调用c++

python中调用c,函数参数用 int类型,返回值为类型1,且返回值为 false。 注意:如果你使用了C中的 false,则返回的是-1。 在 Python中调用C时,你会得到一个名为 bool的类,其中包含了两个成员变量: …

多智能体深度强化学习在移动边缘计算的联合多通道访问和任务卸载中的应用

多智能体深度强化学习在移动边缘计算的联合多通道访问和任务卸载中的应用主要贡献与相关工作比较的贡献三、系统模型(only 2 pages)3.1 网络模型3.2 通信模型3.3 计算模型3.3.1 本地计算3.3.2 卸载计算四、预备知识(only 1 page)五…

SpringCloud-Gateway网关搭建整合nacos配置中心实现动态路由整合sentinel实现服务限流熔点降级

官方文档(更多配置详情直接查看官方文档) 为什么需要服务网关 传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调…

安全防御 --- 恶意代码、防病毒

一、恶意代码 1、按照传播方式分类 (1)病毒 概念:病毒是一种基于硬件和操作系统的程序,具有感染和破坏能力,这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地,它是病毒传播的目的地&#xff0…

MySQL库的操作

文章目录:创建数据库字符集和校验规则查看系统默认字符集和校验规则查看数据库支持的字符集查看数据库支持的字符集校验规则校验规则对数据库的影响操作数据库查看数据库显示创建语句修改数据库删除数据库数据库的备份和还原表的备份和还原查看连接情况创建数据库 …

数据库基础

文章目录前言一、什么是数据库二、主流数据库三、基本使用1.连接服务器2.服务器,数据库,表关系3.使用案例4.数据逻辑存储四、MySQL架构五、SQL分类六、存储引擎1.存储引擎2.查看存储引擎3.存储引擎对比总结前言 正文开始!!! 一、什么是数据库 存储数据用文件就可以了,为什么还…

【并发编程】AQS源码

ReentrantLock 互斥锁,可重入 AQS是可以支持互斥锁和共享锁的,这里只分析互斥锁的源码 加锁 公平锁和非公平锁 公平锁 final void lock() {acquire(1); //抢占1把锁.}// AQS里面的方法public final void acquire(int arg) { if (!tryAcquire(arg) &&acq…

IP协议(网络层重点协议)

目录 一、IP协议报头格式 二、地址选择 1、IP地址 (1)格式 (2)组成 (3)分类 (4)子网掩码 三、路由选择 IP协议是网络层的协议,它主要完成两个方面的任务&#xf…

redis基础(6.0)数据结构、事务、常用组件等

1 概述 1.1 redis介绍 Redis 是互联网技术领域使用最为广泛的存储中间件,它是「Remote Dictionary Service」的首字母缩写,也就是「远程字典服务」。Redis 以其超高的性能、完美的文档、 简洁易懂的源码和丰富的客户端库支持在开源中间件领域广受好评。…

车载网络 - Autosar网络管理 - 常用缩写

为了方便大家日常工作中的使用和交流,每块专业规范或者文章中,都会有或多或少的缩写使用,然而如果一段时间没使用,经常会忘记这些缩写到底代表的是什么意思,为了方便后续内容的介绍,也为了我自己后面忘记后…
最新文章