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

一、说明

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

(一) 解决问题

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

(二) 使用场景

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

二、结构

  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博客

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

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

相关文章

数据分析-Pandas数据探查初步:离散点图

数据分析-Pandas数据探查初步:离散点图 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律&#xff…

动态IP代理技术在网络爬虫中的实际使用

目录 前言 一、什么是动态IP代理技术? 二、动态IP代理技术的实际使用 1. 获取代理IP地址 2. 在网络爬虫中设置代理 3. 周期性更换代理 结论 前言 网络爬虫是一种通过自动化程序从互联网上获取数据的技术。然而,由于某些网站对爬虫进行限制&#…

120KW OBC充电机定期检测的必要性

随着电动汽车的普及,充电设备的需求也在不断增加,其中,120KW OBC(On-Board Charger)充电机作为电动汽车的重要充电设备,其性能和安全性直接关系到电动汽车的使用体验和安全。因此,对120KW OBC充…

使用vuetify实现全局v-alert消息通知

前排提示,本文为引流文,文章内容不全,更多信息前往:oldmoon.top 查看 简介 使用强大的Vuetify开发前端页面,结果发现官方没有提供简便的全局消息通知组件(像Element中的ElMessage那样)&#xf…

C# OpenCvSharp 颜色反转

目录 效果 灰度图 黑白色反转 彩色反转 项目 代码 下载 效果 灰度图 黑白色反转 彩色反转 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Te…

Go Run - Go 语言中的简洁指令

原文:breadchris - 2024.02.21 也许听起来有些傻,但go run是我最喜欢的 Go 语言特性。想要运行你的代码?只需go run main.go。它是如此简单,我可以告诉母亲这个命令,她会立即理解。就像 Go 语言的大部分功能一样&…

调用 科大讯飞机器翻译API 进行中英文翻译(超详细教程)

文章目录 1. 申请讯飞机器翻译API1.1 讯飞开放平台(机器翻译)1.2 点击免费试用后进入个人控制台界面1.3 点击购买字符量(新用户首次免费200万字符)1.4 回到个人控制台界面查看获得的字符量 2.推荐一个好用的Python库 [JioNLP]2.1 …

【java】14:final 关键字

基本介绍: Final01.java final中文意思:最后的,最终的. final可以修饰类、属性、方法和局部变量. 在某些情况下,程序员可能有以下需求,就会使用到final:1当不希望类被继承时,可以用final修饰.【案例演示】 2)当不希望父类的某个方法被子类覆盖/重写(over…

什么是SSH端口转发?

目录 前言: 一、SSH端口转发的概念 二、SSH端口转发的类型 2.1 本地端口转发 2.2 远程端口转发 2.3 动态端口转发 三、SSH端口转发的用途 3.1 安全远程访问 3.2 跨越网络限制 3.3 加密流量传输 3.4 跨越 NAT 网络 3.5 安全代理 四、总结 前言&#xff…

现代信号处理学习笔记(二)参数估计理论

参数估计理论为我们提供了一套系统性的工具和方法,使我们能够从样本数据中推断总体参数,并评估估计的准确性和可靠性。这些概念在统计学和数据分析中起着关键的作用。 目录 前言 一、估计子的性能 1、无偏估计与渐近无偏估计 2、估计子的有效性 两个…

基于深度学习的故障诊断GAN之生成对抗网络

这个图是作者当时研究CGAN画的,从代码流程来看,GAN和CGAN是一样的,两者的区别在于,GAN输入噪声和原始图片,CGAN输入噪声、条件信息(标签)和原始图片,大家可以仔细研究代码&#xff0…

P0故障应对策略之:为什么P0故障难以排查

与大模型探讨P0故障 P0级故障,作为系统中最严重的故障,它们的发生往往带来灾难性的后果和巨大的损失。同时,这类故障的排查与修复也往往复杂而棘手,对整个团队的经验、综合能力、应急处置流程都是巨大的挑战。 排查P0级故障的过程…

简单实现文字滚动效果-CSS版本

先看看效果 话不多说直接上代码 <template><div class"main"><div class"scroll-region"><div class"swiper-scroll-content"><span class"list-btn" v-for"(item, index) in overviewList" :…

IDEA中 @SpringBootApplication 多个注解无法引入依赖

终于解决了&#xff01;&#xff01;&#xff01; cd到报红项目的根目录&#xff0c;然后输入mvn idea:idea就行了。

新的一年,如何优化企业库存管理?

随着社会的发展和经济的不断增长&#xff0c;库存管理成为了企业运营中非常重要的一环。库存作为企业的资产之一&#xff0c;直接影响着企业的盈利能力和竞争优势。因此&#xff0c;对企业库存进行科学的分析和管理&#xff0c;成为了确保企业持续稳定发展的必要手段之一。企业…

为什么深度学习的效果更好?

导 读 深度学习是机器学习的一个子集&#xff0c;已成为人工智能领域的一项变革性技术&#xff0c;在从计算机视觉、自然语言处理到自动驾驶汽车等广泛的应用中取得了显着的成功。 深度学习的有效性并非偶然&#xff0c;而是植根于几个基本原则和进步&#xff0c;这些原则和进…

spring框架Bean的作用域?对需要保持会话状态的bean应使用prototype作用域?为啥?

当一个bean被定义为"prototype"作用域时&#xff0c;每次请求该bean时都会创建一个新的实例&#xff0c;而不是像"singleton"作用域那样共享同一个实例。 对于需要保持会话状态的bean&#xff0c;如果使用"singleton"作用域&#xff0c;会导致所…

Dubbo知识点大全

“ 分布式应用场景有高并发,高可扩展和高性能的要求。还涉及到,序列化/反序列化,网络,多线程以及设计模式的问题。幸好 Dubbo 框架将上述知识进行了封装,让程序员能够把注意力放到业务上。 概念和架构 Provider:暴露服务的服务提供方Consumer:调用远程服务消费方Regist…

Linux系统---nginx(1)服务

目录 一.Nginx概述 1.定义 2.Nginx模块作用 &#xff08;1&#xff09;main模块 &#xff08;2&#xff09;stream服务模块 &#xff08;3&#xff09;邮件服务模块 &#xff08;4&#xff09;第三方模块 &#xff08;5&#xff09;events模块 &#xff08;6&#xff0…

智慧公厕的目的和意义是什么?

智慧公厕是近年来城市建设中的一项重要举措&#xff0c;其目的在于实现公共厕所的智慧化管理&#xff0c;为市民群众提供更好的服务体验&#xff0c;助力智慧城市和数字环卫的发展&#xff0c;提升社会公共卫生服务水平。 与此同时&#xff0c;智能公厕也具有重要的意义&#x…