【Python笔记-设计模式】责任链模式

news2025/2/25 12:06:34

一、说明

旨在将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。

(一) 解决问题

将请求的发送者和接受者解耦,并使请求随着处理对象链传递,优化系统内部处理逻辑

(二) 使用场景

  • 当程序需要使用不同方式处理不同种类请求, 而且请求类型和顺序预先未知时
  • 当必须按顺序执行多个处理者时
  • 当一个对象需要在运行时动态地确定其处理对象时

二、结构

  1. 处理者(Handler)声明了所有具体处理者的通用接口。该接口通常仅包含单个方法用于请求处理,但有时其还会包含一个设置链上下个处理者的方法。
  2. 基础处理者(BaseHandler)是一个可选的类,你可以将所有处理者共用的样本代码放置在其中。通常情况下,该类中定义了一个保存对于下个处理者引用的成员变量。客户端可通过将处理者传递给上个处理者的构造函数或设定方法来创建链。该类还可以实现默认的处理行为:确定下个处理者存在后再将请求传递给它。
  3. 具体处理者(ConcreteHandlers)包含处理请求的实际代码。每个处理者接收到请求后,都必须决定是否进行处理,以及是否沿着链传递请求。处理者通常是独立且不可变的,需要通过构造函数一次性地获得所有必要地数据。
  4. 客户端(Client)可根据程序逻辑一次性或者动态地生成链。值得注意的是,请求可发送给链上的任意一个处理者,而非必须是第一个处理者。

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
责任链模式

例:一个产品生产流水线,需要三个环节:生产、质检、包装。每个环节只能由对应的工人处理,如果无法处理则传递给下一个环节处理。
"""

from abc import ABC, abstractmethod


class Worker(ABC):
    """抽象处理类"""

    @abstractmethod
    def handle_product(self, product):
        pass

    @abstractmethod
    def set_next_worker(self, worker):
        pass


class Producer(Worker):
    """具体处理类"""

    def __init__(self):
        self.next_worker = None

    def set_next_worker(self, worker):
        self.next_worker = worker

    def handle_product(self, product):
        if product.get("process") == "produce":
            print("生产商正在生产产品")
        elif self.next_worker:
            self.next_worker.handle_product(product)


class Inspector(Worker):
    """具体处理类"""

    def __init__(self):
        self.next_worker = None

    def set_next_worker(self, worker):
        self.next_worker = worker

    def handle_product(self, product):
        if product.get("process") == "inspect":
            print("检验员正在检验产品")
        elif self.next_worker:
            self.next_worker.handle_product(product)


class Packer(Worker):
    """具体处理类"""

    def __init__(self):
        self.next_worker = None

    def set_next_worker(self, worker):
        self.next_worker = worker

    def handle_product(self, product):
        if product.get("process") == "pack":
            print("包装商正在包装产品")
        elif self.next_worker:
            self.next_worker.handle_product(product)


if __name__ == "__main__":
    """
        生产商正在生产产品
        检验员正在检验产品
        包装商正在包装产品
    """
    producer = Producer()
    inspector = Inspector()
    packer = Packer()

    producer.set_next_worker(inspector)
    inspector.set_next_worker(packer)

    product1 = {"process": "produce"}
    product2 = {"process": "inspect"}
    product3 = {"process": "pack"}

    producer.handle_product(product1)
    producer.handle_product(product2)
    producer.handle_product(product3)

四、优缺点

优点

  • 降低耦合度:将请求的发送者和接收者解耦,每个处理对象只需关注自己的处理逻辑,不需要知道整个处理链的结构,降低了对象之间的耦合度。
  • 灵活性:允许动态地添加、移除或修改处理对象,可以根据需要调整处理链的结构,提高了系统的灵活性。
  • 简化对象之间的交互:将处理对象的关系组织成一条链,简化了对象之间的交互,使得系统更易于理解和维护。
  • 可扩展性:允许动态地添加新的处理对象,因此可以很容易地扩展系统的功能,满足不断变化的需求。

缺点

  • 性能问题:责任链模式可能会导致请求在整个处理链上传递,直到有一个处理对象处理请求为止,如果处理链过长或者处理对象之间的处理时间不均匀,可能会影响系统的性能。
  • 调试困难:责任链模式将请求的处理分散在多个处理对象中,可能会导致调试时比较困难,特别是处理链比较长的情况下。

【Python笔记】设计模式-CSDN博客

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

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

相关文章

springboot+vue前后端分离适配cas认证的跨域问题

0. cas服务搭建参考:CAS 5.3服务器搭建_cas-overlay-CSDN博客 1. 参照springsecurity适配cas的方式, 一直失败, 无奈关闭springssecurity认证 2. 后端服务适配cas: 参考前后端分离项目(springbootvue)接入单点登录cas_前后端分离做cas单点登录-CSDN博客 1) 引入maven依赖 …

shell的基本介绍

一. 什么是shell Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程 序设计语言。shell是解释执行的。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问…

[c 语言] 大端,小端;网络序,主机序

在网络编程中,特别是底层网卡驱动开发时,常常遇到字节序问题。字节序指的是多字节数据类型在内存中存放的顺序,高位保存在低地址还是高地址,以此来划分大端还是小端。 1 大端和小端 大端和小端指的是 cpu 的属性,常见…

视频如何无水印保存?这两个方法帮你一键保存

在互联网的浩瀚海洋中,我们时常会遇到那些令人心动、想要珍藏的视频。无论是教育资料、精彩瞬间,还是心仪的影片、综艺节目,我们都希望能够随时随地欣赏它们。然而,网络上的视频往往受到地域、平台、设备等多种限制,使…

数组指针。

数组指针:*先与数组名结合,后与方块结合。 指针数组:*先与方块结合。 int(*p)[5]和&arr的类型均为int(*)[5] &arr取出的是数组整个地址。&arr[0]与arr相同,是数组首地址。 一般在二维数组中使用数组指针 打印时要写…

StarRocks实战——多维分析场景与落地实践

目录 一、OLAP 系统历史背景 1.1 历史背景与痛点 1.2 组件诉求 二、StarRocks 的特点和优势 2.1 极致的查询性能 2.2 丰富的导入方式 2.3 StarRocks 的优势特点 三、多维分析的运用场景 3.1 实时计算场景 / 家长监控中心 3.2 实时更新模型选择 3.2.1 更新模型UNIQU…

动态规划的时间复杂度优化

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 优化动态规划的时间复杂度,主要有如下几种: 一,不同的状态表示。 比如:n个人,m顶帽子。 第一种方式:dp[i][mask] ,i表示前i个人已经选择帽子&…

安防视频监控平台EasyNVR级联视频上云管理平台EasyNVS,出现报错“i/o deadline reached”该如何解决?

上云网关管理平台EasyNVS视频综合管理系统具备汇聚与管理EasyGBS、EasyNVR等平台的能力,系统可以将接入的视频资源实现视频能力统一输出,并能进行远程可视化运维等管理功能,还能解决设备现场没有固定公网IP却需要在公网直播的需求。 有用户反…

【数据结构】栈OJ题《用栈实现队列》(题库+解析+代码)

1. 前言 通过前面栈的实现和详解大家对队列应该有一定熟悉了,现在上强度开始做题吧 栈详解:http://t.csdnimg.cn/9Fsbs 本体的做题思路也可以参考上一篇文章,就是有一点点不同。 用队列实现栈:http://t.csdnimg.cn/V2qjW 2. …

Connection模块类功能联调(整合三)

目录 概要 tcp_cli.cc tcp_srv.cc server.hpp 测试结果 第三次整合 概要 本主要是将以下模块进行整合测试 Connection管理类实现(模块六)-CSDN博客 EventLoop整合与TimerWheel联合调试(整合二)-CSDN博客 tcp_cli.cc #include "../source/server.hpp"int main…

大开眼界的4款黑科技软件,功能强大,网友:越用越上瘾

作为一名热衷于探索软件的搞机爱好者,小蛙在各大软件论坛间游走,旨在帮助大家在纷繁复杂的Windows软件世界中,寻找到那些真正值得安装的神器。 在忙碌的现代生活中,我们的磁盘空间和时间都显得尤为宝贵,没必要下一些鸡…

web网站怎么做压力测试

Web网站性能体现在并发用户数已经网站的吞吐量和时延。 最简单的压力测试工具就是ab "Apache Benchmark" 下面将介绍ab的安装和使用: 1. ab的安装 ab的安装非常简单,安装了httpd,就自带ab。 CentOS下的安装: yum install -y httpd …

docker 常用指令(启动,关闭,查看运行状态)

文章目录 docker 常用指令启动 docker关闭 docker查看 docker的运行状态 docker 常用指令 启动 docker systemctl start docker关闭 docker systemctl stop docker查看 docker的运行状态 systemctl status docker如下图所示: 表示docker正在运行中

云呐智能生产线安装与运维是做什么的?需要学哪些内容?

能生产线安装与运维主要负责智能化生产线的组装、接线、调试、辅助生产和运维等工作。  智能生产线安装与运维工作的核心在于保证智能生产线的高效运转和持续优化。具体来说,这个领域的工作人员需要掌握机械、电工电子技术、工业机器人等基础知识和技能&#xff0…

如何进行Appium实现移动端UI自动化测试?

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号【互联网杂货铺】,回复 1 ,免费获取软件测试全套资料,资料在手,涨薪更快 Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学…

亚信安慧AntDB助力全链路实时化

实时数据平台,快速实现企业全链路实时化 引入数据仓库、数据挖掘、HTAP等先进理念,通过实时数据应用平台来装载庞大的信息量,进行实时分析处理,克服数据处理过程中的困难,是当下各企事业单位、互联网、金融&#xff0c…

学习pybind11:Hello World例子

首先要明白pybind11是干啥的,对于一个C/C库,可以用pybind11封装它的接口为Python接口,这样得到一个python库,就可以把功能强大的库丢给使用python的boys & girls使用了~ 因此,使用pybind11做封装,是我…

Golang 实现 websocket 通讯(一个服务器,两个客户端)

运行客户端时首先要输入自己的名字,两个客户端输入的名字不能一样。 先上运行结果: 服务器端: 客户端1: 客户端2: 话不多说,直接上代码: 服务器端: package mainimport ("f…

计算机网络-后退N帧协议(弊端 滑动窗口 运行中的GBN 滑动窗口长度习题 GBN协议性能分析 )

文章目录 停等协议的弊端后退N帧协议中的滑动窗口GBN发送方必须响应的三件事GBN接受方要做的事运行中的GBN滑动窗口长度GBN协议重点总结习题1习题2GBN协议性能分析小结 停等协议的弊端 信道利用率低:在停等协议中,发送方在发送完一帧后必须等待接收方确…

教师编制取消?什么时候执行?

有关教师编制取消的传闻在教育界和社交媒体上闹得沸沸扬扬。许多老师、家长、学生都对此表示了极大的关注。教师编制真的会取消吗?如果取消,又将在何时执行? 教师编制,作为一种职业保障和身份,在很长一段时间内被视为教…