行为型——责任链模式

news2025/3/31 22:49:58

责任链模式

责任链模式是一种行为型设计模式,它允许请求沿着处理链传递,直到有一个处理者处理为止。其核心思想是解耦请求发送者与接收者。

特点

  • 解耦处理者与接收者: 发送者无需知道哪一个接收者处理请求,接收者也无需知道请求的细节。
  • 动态构建处理链: 灵活的调整处理者的顺序或增减处理者。
  • 责任明确: 每个处理者只负责处理特定的请求。

模式结构

角色描述
抽象处理者(Handler)定义了处理请求的接口,并且可以访问它的后继者
具体处理者(ConcreteHandler)实现了处理请求的接口,判断是否可以处理该请求,否则将请求传递给它的后继者
客户端(Client)创建处理链,并向链的头部发起请求

简单示例

from abc import ABC, abstractmethod
from typing import Optional


# 处理者抽象类
class Approver(ABC):

    def __init__(self):
        self._successor: Optional[Approver] = None

    def set_successor(self, successor: 'Approver') -> 'Approver':
        self._successor = successor
        return successor

    @abstractmethod
    def handle_request(self, amount: float) -> str:
        pass


# 具体处理者类
class Supervisor(Approver):
    def handle_request(self, amount: str) -> str:
        if amount <= 500:
            return f'Supervisor approved ${amount} Reimbursement.'
        elif self._successor:
            return self._successor.handle_request(amount)
        else:
            return f'${amount} Reimbursement denied.'

class DepartmentManager(Approver):
    def handle_request(self, amount: str) -> str:
        if amount <= 1000:
            return f'Department Manager approved ${amount} Reimbursement.'
        elif self._successor:
            return self._successor.handle_request(amount)
        else:
            return f'${amount} Reimbursement denied.'

class CEO(Approver):
    def handle_request(self, amount: str) -> str:
        if amount <= 10000:
            return f'CEO approved ${amount} Reimbursement.'
        elif self._successor:
            return self._successor.handle_request(amount)
        else:
            return f'${amount} Reimbursement denied.'

# 客户端代码
if __name__ == '__main__':
    supervisor = Supervisor()
    department_manager = DepartmentManager()
    ceo = CEO()
    supervisor.set_successor(department_manager).set_successor(ceo)

    requests = [250, 600, 1250, 10000]
    for amount in requests:
        print(supervisor.handle_request(amount))

    # 结果输出
    # Supervisor approved $250.0 Reimbursement.
    # Department Manager approved $600.0 Reimbursement.
    # CEO approved $1250.0 Reimbursement.
    # 10000 Reimbursement denied.

适用场景

  • 多级请求处理,如审批流程
  • 动态请求处理,如Web框架的中间件
  • 需要按优先级处理请求,如客服系统

优缺点

  • 优点:
    • 减少耦合:处理者与请求者之间解耦,请求者无需知道处理者
    • 符合单一职责和开闭原则
  • 缺点:
    • 请求可能未被处理,需要添加兜底逻辑
    • 调试复杂,链条过长时,对象的状态和处理者顺序有关联,需要跟踪整个链条

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

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

相关文章

【计算机网络】OSI七层模型完全指南:从比特流到应用交互的逐层拆解

OSI模型 导读一、概念二、模型层次结构2.1 物理层&#xff08;Physical Layer&#xff09;2.2 数据链路层&#xff08;Data Link Layer&#xff09;​2.3 ​网络层&#xff08;Network Layer&#xff09;​2.4 ​传输层&#xff08;Transport Layer&#xff09;​2.5 ​会话层&…

数据不互通、审批慢?如何实现多系统智能协同

在企业信息化建设的过程中&#xff0c;数据孤岛和复杂的审批流程常常成为实现高效协同的巨大障碍。对于许多组织来说&#xff0c;面对越来越复杂的业务需求&#xff0c;如何实现多系统智能协同不仅关乎效率&#xff0c;更直接影响企业的竞争力。 数据不互通和审批流程慢的痛点…

如何用 Postman 正确传递 Date 类型参数,避免服务器解析错误?

如何在 Postman 中传递 Date 类型参数。调试工具如何模拟发送用户端的当前时间呢&#xff1f; Postman 传递 Date 类型参数教程

JUC 03

今天是2025/03/28 20:46 day 14 总路线请移步主页Java大纲相关文章 今天进行JUC 6,7,8 个模块的归纳 首先是JUC的相关内容概括的思维导图 由于内容比较多且重要&#xff0c; 个人还整理了一份详细JUC的思维导图&#xff0c;需要的请评论。是 xmind文件 6. 锁机制 深入解析…

CentOS 7 部署RuoYi 项目

换源 备份现有的 YUM 源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 默认的 CentOS 官方镜像源替换为阿里云的镜像源&#xff0c;以提高下载速度和稳定性。 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.co…

【JavaScript】八、对象

文章目录 1、对象的声明2、对象的使用3、对象中的方法4、遍历对象5、内置对象Math 1、对象的声明 一种数据类型&#xff0c;使用typeof查看类型&#xff0c;结果是object可以详细的描述描述某个事物 声明语法&#xff1a; // 多用花括号形式声明 // 比如声明一个person对象 …

Processor System Reset IP 核 v5.0(vivado)

这个IP的作用&#xff0c;我的理解是&#xff0c;比普通按键复位更加高效灵活&#xff0c;可以配置多个复位输出&#xff0c;可以配置复位周期。 1、输入信号&#xff1a; 重要的信号有时钟clk信号&#xff0c;一般连接到系统时钟&#xff1b;输入复位信号&#xff0c;一般是外…

linux0.11内核源码修仙传第十一章——硬盘初始化

&#x1f680; 前言 本文是初始化最后一部分了&#xff0c;对硬盘的初始化&#xff0c;对应于书中的第20回。希望各位给个三连&#xff0c;拜托啦&#xff0c;这对我真的很重要&#xff01;&#xff01;&#xff01; 目录 &#x1f680; 前言&#x1f3c6;块设备管理&#x1f3…

包络解调在故障诊断中的应用-广义检波解调案例

前言 前面我们曾介绍过广义检波解调的原理&#xff0c;那么今天就将学过的知识点真正用在故障诊断上&#xff0c;由于工厂数据集不能轻易获取&#xff0c;因此通过实验室仿真数据集来介绍整个诊断流程。 数据集 加拿大渥太华是故障诊断领域蛮出名的一个数据集&#xff0c;其…

喜报|迪捷软件入选工信部“2024年信息技术应用创新解决方案”

为进一步深化行业信息技术应用创新&#xff0c;健全信息技术应用创新产业生态&#xff0c;加快新技术新产品应用推广&#xff0c;强化应用牵引和需求导向&#xff0c;加强区域联动和资源整合&#xff0c;工业和信息化部网络安全产业发展中心&#xff08;工业和信息化部信息中心…

2.Python 计算机二级题库:选择题答案解析

一 对 题目1 题目2 题目3 补充&#xff1a;在 Python 中&#xff0c;数字类型的复数类型是 complex。 题目4 题目5 题目6 题目7 题目8 题目9 题目10 题目11 题目12 题目13 题目14 题目15 题目16 题目17 题目18 题目19 题目20 题目21 题目22 题目23 题目24 题目25 题目26 题目27…

使用Selenium和lxml库搜房网爬取某地区房屋信息(python、pycharm爬虫)

一、地址&#xff1a; url "https://zb.newhouse.fang.com/house/s/b91" # 第一页的 URL 但是这个爬虫我不知道为啥总是翻不了页数&#xff0c;请帮忙修改一下~ 二、用到的知识点以及代码详解&#xff1a; 这段代码是一个使用Selenium和lxml库实现的网页爬虫&a…

大模型训练过程中KVCache与MLA

基础内容 在Transformer模型中&#xff0c;每个token有qkv三个属性&#xff0c;分别通过神经网络变换得到。1 根据Transformer中注意力公式&#xff0c;每个token的q需要和之前所有的k计算注意力&#xff0c;然后经过Softmax函数后乘以之前所有token的V&#xff0c;得到最终的…

材质及制作笔记

基本流程&#xff1a; 建中模——zb雕刻高模——maya拓扑低模——拆uv——sp烘焙贴图——sp绘制材质——渲染 1 材质贴图&#xff1a; diffuse/albedo/basecolor&#xff1a;漫反射 reflection/specular&#xff1a;反射 metalness&#xff1a;金属度 glossiness&#xf…

语音机器人与智能体结合

自从春节期间deepseek的发布&#xff0c;大家对语音机器人接入大模型格外的关注。最近又收到一个需求&#xff0c;是语音机器人与智能体的结合。 什么是智能体&#xff1f; 智能体&#xff08;Agent&#xff09;是指能够感知环境并采取行动以实现目标的实体。根据其复杂程度&am…

Axios企业级封装实战:从拦截器到安全策略!!!

&#x1f680; Axios企业级封装实战&#xff1a;从拦截器到安全策略 &#x1f527; 核心代码解析 // 创建Axios实例 const service axios.create({baseURL: api, // &#x1f310; 全局API前缀timeout: 0, // ⏳ 永不超时&#xff08;慎用&#xff01;&#xff09;withCrede…

Zerotier虚拟局域网在树莓派的应用和Syncthing配合Zerotier实现端到端文件同步

一、Zerotier的部署 1、官网注册账号 https://my.zerotier.com/i 2、选择linux系统&#xff0c;执行安装Zerotier curl -s https://install.zerotier.com | sudo bash3、将树莓派网络加入Zerotier zerotier-cli join DB62228FEDF6CE55DB62228FEDF6CE55 为你的Zerotier IP 需…

51c嵌入式~三极管~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12208603 一、PNP与NPN两种三极管使用方法 分享这篇文章总结下关于NPN和PNP两种型号三极管的使用和连接方法。 在单片机应用电路中三极管主要的作用就是开关作用。 PNP与NPN两种三极管使用方法 上图中&#xff0c;横向左…

SQL中累计求和与滑动求和函数sum() over()的用法

[TOC](SQL中累计求和与滑动求和函数sum() over()的用法) 一、窗口函数功能简介 sum(c) over(partition by a order by b) 按照一定规则汇总c的值&#xff0c;具体规则为以a分组&#xff0c;每组内按照b进行排序&#xff0c;汇总第一行至当前行的c的加和值。 sum()&#xff1a…

【Sql Server】在SQL Server中生成雪花ID(Snowflake ID)

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言认识雪花ID…