行为型——责任链模式
责任链模式
责任链模式是一种行为型设计模式,它允许请求沿着处理链传递,直到有一个处理者处理为止。其核心思想是解耦请求发送者与接收者。
特点
- 解耦处理者与接收者: 发送者无需知道哪一个接收者处理请求,接收者也无需知道请求的细节。
- 动态构建处理链: 灵活的调整处理者的顺序或增减处理者。
- 责任明确: 每个处理者只负责处理特定的请求。
模式结构
| 角色 | 描述 |
|---|---|
| 抽象处理者(Handler) | 定义了处理请求的接口,并且可以访问它的后继者 |
| 具体处理者(ConcreteHandler) | 实现了处理请求的接口,判断是否可以处理该请求,否则将请求传递给它的后继者 |
| 客户端(Client) | 创建处理链,并向链的头部发起请求 |
简单示例
from abc import ABC, abstractmethod
from typing import Optional# 处理者抽象类
class Approver(ABC):def __init__(self):self._successor: Optional[Approver] = Nonedef set_successor(self, successor: 'Approver') -> 'Approver':self._successor = successorreturn successor@abstractmethoddef 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框架的中间件
- 需要按优先级处理请求,如客服系统
优缺点
- 优点:
- 减少耦合:处理者与请求者之间解耦,请求者无需知道处理者
- 符合单一职责和开闭原则
- 缺点:
- 请求可能未被处理,需要添加兜底逻辑
- 调试复杂,链条过长时,对象的状态和处理者顺序有关联,需要跟踪整个链条
相关文章:
行为型——责任链模式
责任链模式 责任链模式是一种行为型设计模式,它允许请求沿着处理链传递,直到有一个处理者处理为止。其核心思想是解耦请求发送者与接收者。 特点 解耦处理者与接收者: 发送者无需知道哪一个接收者处理请求,接收者也无需知道请求的细节。动…...
<wbr>标签的用途,在处理长文本换行时如何发挥作用?
大白话标签的用途,在处理长文本换行时如何发挥作用? 在 HTML 里,<wbr> 标签可以说是处理长文本换行问题的一把利器。接下来,我会详细说明它的用途,以及在处理长文本换行时发挥的作用 <wbr> 标签用途概述…...
【C#】关键字 volatile
volatile 是 C# 中一个用于多线程编程的关键字,作用是确保变量的可见性 —— 也就是说,一个线程对变量的修改,其他线程可以马上“看到”。 🔍 为什么需要 volatile? 在多线程中,CPU 和编译器可能会对代码进…...
【计算机网络】OSI七层模型完全指南:从比特流到应用交互的逐层拆解
OSI模型 导读一、概念二、模型层次结构2.1 物理层(Physical Layer)2.2 数据链路层(Data Link Layer)2.3 网络层(Network Layer)2.4 传输层(Transport Layer)2.5 会话层&…...
数据不互通、审批慢?如何实现多系统智能协同
在企业信息化建设的过程中,数据孤岛和复杂的审批流程常常成为实现高效协同的巨大障碍。对于许多组织来说,面对越来越复杂的业务需求,如何实现多系统智能协同不仅关乎效率,更直接影响企业的竞争力。 数据不互通和审批流程慢的痛点…...
量子力学:从经典物理危机到思维革命的新纪元
目录 一、经典物理的黄昏:危机四伏的 “完美大厦” (一)牛顿力学的辉煌与局限 (二)麦克斯韦电磁理论的成就与困境 (三)热力学与统计物理学的发展与难题 二、旧量子论的破晓:突破…...
深入解析 JSON-RPC:从基础到高级应用(附调用示例)
在当今的软件开发领域,远程过程调用(RPC)技术是实现分布式系统间通信的关键手段之一。JSON-RPC,作为一种基于 JSON 数据格式的轻量级 RPC 协议,因其简洁性和高效性而备受青睐。本文将全面深入地探讨 JSON-RPC 的核心概…...
如何用 Postman 正确传递 Date 类型参数,避免服务器解析错误?
如何在 Postman 中传递 Date 类型参数。调试工具如何模拟发送用户端的当前时间呢? Postman 传递 Date 类型参数教程...
JUC 03
今天是2025/03/28 20:46 day 14 总路线请移步主页Java大纲相关文章 今天进行JUC 6,7,8 个模块的归纳 首先是JUC的相关内容概括的思维导图 由于内容比较多且重要, 个人还整理了一份详细JUC的思维导图,需要的请评论。是 xmind文件 6. 锁机制 深入解析…...
CentOS 7 部署RuoYi 项目
换源 备份现有的 YUM 源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 默认的 CentOS 官方镜像源替换为阿里云的镜像源,以提高下载速度和稳定性。 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.co…...
【JavaScript】八、对象
文章目录 1、对象的声明2、对象的使用3、对象中的方法4、遍历对象5、内置对象Math 1、对象的声明 一种数据类型,使用typeof查看类型,结果是object可以详细的描述描述某个事物 声明语法: // 多用花括号形式声明 // 比如声明一个person对象 …...
Processor System Reset IP 核 v5.0(vivado)
这个IP的作用,我的理解是,比普通按键复位更加高效灵活,可以配置多个复位输出,可以配置复位周期。 1、输入信号: 重要的信号有时钟clk信号,一般连接到系统时钟;输入复位信号,一般是外…...
linux0.11内核源码修仙传第十一章——硬盘初始化
🚀 前言 本文是初始化最后一部分了,对硬盘的初始化,对应于书中的第20回。希望各位给个三连,拜托啦,这对我真的很重要!!! 目录 🚀 前言🏆块设备管理dz…...
包络解调在故障诊断中的应用-广义检波解调案例
前言 前面我们曾介绍过广义检波解调的原理,那么今天就将学过的知识点真正用在故障诊断上,由于工厂数据集不能轻易获取,因此通过实验室仿真数据集来介绍整个诊断流程。 数据集 加拿大渥太华是故障诊断领域蛮出名的一个数据集,其…...
springboot 四层架构之间的关系整理笔记五
问题:service 和 多个serviceimpl 分层之间的逻辑关系? 好的!用班级活动的例子继续讲,假设班长(Service接口)要管理多种任务,而不同的班委(ServiceImpl实现类)负责不同场…...
喜报|迪捷软件入选工信部“2024年信息技术应用创新解决方案”
为进一步深化行业信息技术应用创新,健全信息技术应用创新产业生态,加快新技术新产品应用推广,强化应用牵引和需求导向,加强区域联动和资源整合,工业和信息化部网络安全产业发展中心(工业和信息化部信息中心…...
小林coding-12道Spring面试题
1.说一下你对 Spring 的理解?spring的核心思想说说你的理解? 2.Spring IoC和AOP 介绍一下?Spring的aop介绍一下?IOC和AOP是通过什么机制来实现的?怎么理解SpringIoc?依赖倒置,依赖注入,控制反转分别是什么?依赖注…...
2.Python 计算机二级题库:选择题答案解析
一 对 题目1 题目2 题目3 补充:在 Python 中,数字类型的复数类型是 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爬虫)
一、地址: url "https://zb.newhouse.fang.com/house/s/b91" # 第一页的 URL 但是这个爬虫我不知道为啥总是翻不了页数,请帮忙修改一下~ 二、用到的知识点以及代码详解: 这段代码是一个使用Selenium和lxml库实现的网页爬虫&a…...
大模型训练过程中KVCache与MLA
基础内容 在Transformer模型中,每个token有qkv三个属性,分别通过神经网络变换得到。1 根据Transformer中注意力公式,每个token的q需要和之前所有的k计算注意力,然后经过Softmax函数后乘以之前所有token的V,得到最终的…...
材质及制作笔记
基本流程: 建中模——zb雕刻高模——maya拓扑低模——拆uv——sp烘焙贴图——sp绘制材质——渲染 1 材质贴图: diffuse/albedo/basecolor:漫反射 reflection/specular:反射 metalness:金属度 glossiness…...
语音机器人与智能体结合
自从春节期间deepseek的发布,大家对语音机器人接入大模型格外的关注。最近又收到一个需求,是语音机器人与智能体的结合。 什么是智能体? 智能体(Agent)是指能够感知环境并采取行动以实现目标的实体。根据其复杂程度&am…...
使用git-lfs管理大文件
当我们使用git管理文件版本的时候,经常会有一些比较大的文件,比如一些模型文件,或者备份的文档资料等,这些文件属于如果太大,就会给git的管理带来困难。 所以,对于这种大文件,一般我们就会采用…...
vs2022+QT6.7.3打包程序流程
1、新建目录test 2、将项目配置为Release X64,生成XXX.exe 3、将XXX.exe放到test目录 4、管理员方式打开Qt 6.7.3 (MSVC 2022 64-bit),进入test目录,执行:windeployqt6.exe XXX.exe 5、管理员方式打开x64 Native Tools Command Pr…...
Axios企业级封装实战:从拦截器到安全策略!!!
🚀 Axios企业级封装实战:从拦截器到安全策略 🔧 核心代码解析 // 创建Axios实例 const service axios.create({baseURL: api, // 🌐 全局API前缀timeout: 0, // ⏳ 永不超时(慎用!)withCrede…...
关于计算机视觉中的插值小记
计算机视觉中的插值(Interpolation)讲解 插值(Interpolation)在计算机视觉中是一项基础操作,常用于图像缩放、旋转、去噪、图像重建等任务。其核心思想是在已知数据点之间进行推测,估计未知的像素值或特征…...
img 的 onerror属性
名词解释: img 标签的 onerror 属性是一个事件处理属性,当图片因 src 地址无效、网络问题或其他加载错误导致加载失败时,会触发该属性内的代码。 1. <img> 标签的 src 属性 src(source 的缩写)属性是 <img…...
Zerotier虚拟局域网在树莓派的应用和Syncthing配合Zerotier实现端到端文件同步
一、Zerotier的部署 1、官网注册账号 https://my.zerotier.com/i 2、选择linux系统,执行安装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两种三极管使用方法 上图中,横向左…...
Logback使用和常用配置
Logback 是 Spring Boot 默认集成的日志框架,相比 Log4j,它性能更高、配置更灵活,并且天然支持 Spring Profile 多环境配置。以下是详细配置步骤及常用配置示例。 一、添加依赖(非 Spring Boot 项目) 若项目未使用 Sp…...
