python实现责任链模式

把多个处理方法串成一个list。下一个list的节点是上一个list的属性。

每个节点都有判断是否能处理当前数据的方法。能处理,则直接处理,不能处理则调用下一个节点(也就是当前节点的属性)来进行处理。

Python 实现责任链模式,以request 的请求处理为例 :

1、RequestHandler 类

基础的请求处理器类,定义了处理请求的接口和责任链的基本逻辑。

2、子类 GetRequestHandler, PostRequestHandler, PutRequestHandler, DeleteRequestHandler

每个子类实现了 can_handle 方法和 handle 方法,根据请求的方法(GET, POST, PUT, DELETE)判断是否能够处理该请求,并实现具体的请求处理逻辑。

3、Usage 部分

  • 创建了一个示例的请求对象 Request,包含请求的方法 (method) 和 URL (url)。
  • 创建了四个请求处理器,并按照顺序构建了责任链:GET -> POST -> PUT -> DELETE。
  • 调用 get_handler.handle_request(authentication_info_obj) 发起请求处理,结果会根据请求方法逐级传递到能够处理该请求的处理器,并返回处理结果。

class RequestHandler:def __init__(self, successor=None):self.successor = successordef handle_request(self, request):if not self.successor:raise NotImplementedError("A successor must be defined.")if self.can_handle(request):return self.handle(request)else:return self.successor.handle_request(request)def can_handle(self, request):raise NotImplementedError("Subclasses should implement this method.")def handle(self, request):raise NotImplementedError("Subclasses should implement this method.")class GetRequestHandler(RequestHandler):def can_handle(self, request):return request['method'] == 'GET'  # Check if the method is GETdef handle(self, request):# Handle GET request logicreturn f"Handling GET request for {request['url']}"class PostRequestHandler(RequestHandler):def can_handle(self, request):return request['method'] == 'POST'  # Check if the method is POSTdef handle(self, request):# Handle POST request logicreturn f"Handling POST request for {request['url']}"class PutRequestHandler(RequestHandler):def can_handle(self, request):return request['method'] == 'PUT'  # Check if the method is PUTdef handle(self, request):# Handle PUT request logicreturn f"Handling PUT request for {request['url']}"class DeleteRequestHandler(RequestHandler):def can_handle(self, request):return request['method'] == 'DELETE'  # Check if the method is DELETEdef handle(self, request):# Handle DELETE request logicreturn f"Handling DELETE request for {request['url']}"# Usage
if __name__ == "__main__":request_obj = {'method': 'GET', 'url': 'https://example.com'}# Create handlersdelete_handler = DeleteRequestHandler()put_handler = PutRequestHandler(delete_handler)post_handler = PostRequestHandler(put_handler)get_handler = GetRequestHandler(post_handler)# Example usageresult = get_handler.handle_request(request_obj)print(result)

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

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

相关文章

在浏览器中测试JavaScript代码方法简要介绍

在浏览器中测试JavaScript代码方法简要介绍 在浏览器中测试JavaScript代码是前端开发中的一个重要技能。方法如下: 1. 浏览器控制台 最简单和直接的方法是使用浏览器的开发者工具中的控制台(Console)。 步骤: 在大多数浏览器…

Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示

Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示 目录 Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示 一、简单介绍 二、共享纹理 1、共享纹理的原理 2、共享纹理涉及到的关键知识点 3、什么可以实现共享 不能实现共享…

有关于链表带环的两道OJ题目

目录 1.判断链表是否带环 1.1快指针的速度为慢指针的2倍 1.2快指针的速度为慢指针的3倍 2.找出带环链表开始入环的第一个节点 2.1将快慢指针相遇的节点与后面分开,构造交叉链表 2.2记录快慢指针相遇节点,与头结点一起向后走,相遇点为入…

远程开启空调,享受即刻凉爽

随着夏季的热浪逐渐侵袭,我们都渴望回到家中那一刻,能感受到一丝丝的凉意。但是,有时候,即使我们提前开窗通风,房间里的温度依然像烤箱一样闷热难耐。那么,有没有一种方法,能让我们在外头酷暑难…

升级Nvidia CUDA 遇到 sub-process /usr/bin/dpkg returned an error code (1)

1.问题描述 在自己Ubuntu22.04的服务器环境上存在cuda版本为11.5,按照官网教程升级为12.1运行安装命令 sudo apt-get -y install cuda 报错:sub-process /usr/bin/dpkg returned an error code (1) 官网教程: https://developer.nvidia…

PCIE软件基础知识

什么是PCIE PCIe,全称 Peripheral Component Interconnect Express,是一种高速串行计算机扩展总线标准,用于连接计算机内部的硬件组件,如显卡、存储设备、网络适配器等。PCIe是一种点对点的双向通信标准,这意味着它在发…

微信小程序canvas 使用案例(一)

一、cavans 对象获取、上线文创建 1.wxml <!-- canvas.wxml --><canvas type"2d" id"myCanvas"></canvas> 2.js /*** 生命周期函数--监听页面加载*/onLoad(options) {const query wx.createSelectorQuery()query.select(#myCanvas).f…

分离式网络变压器的集成化设计替代传统网络变压器(网络隔离滤波器)尝试

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;今天分享的是应用了分离式网络变压器设计的的新型网络变压器&#xff08;网络隔离变压器&#xff09; 今天我们一起来看这款新型网络变压器&#xff0c;它就是应用分离式网络变压器集成到电路板上&#xff0c;加上外…

CAS乐观锁原理

1、什么是CAS&#xff1f; compare and swap也就是比较和交换&#xff0c;他是一条CPU的并发原语。 他在替换内存的某个位置的值时&#xff0c;首先查看内存中的值与预期值是否一致&#xff0c;如果一致&#xff0c;执行替换操作。 这个操作是一个原子性操作。 Java中基于Un…

昇思学习打卡-21-生成式/Diffusion扩散模型

文章目录 Diffusion扩散模型介绍模型推理结果 Diffusion扩散模型介绍 关于扩散模型&#xff08;Diffusion Models&#xff09;有很多种理解&#xff0c;除了本文介绍的离散时间视角外&#xff0c;还有连续时间视角、概率分布转换视角、马尔可夫链视角、能量函数视角、数据增强…

虚拟机迁移报错:虚拟机版本与主机“x.x.x.x”的版本不兼容

1.虚拟机在VCenter上从一个ESXi迁移到另一个ESXi上时报错&#xff1a;虚拟机版本与主机“x.x.x.x”的版本不兼容。 2.例如从10.0.128.13的ESXi上迁移到10.0.128.11的ESXi上。点击10.0.128.10上的任意一台虚拟机&#xff0c;查看虚拟机版本。 3.确认要迁移的虚拟机磁盘所在位…

操作系统---死锁相关

目录 一. 基础概念死锁的定义死锁与饥饿死锁产生原因死锁产生的必要条件资源分配圈&#xff1a;循环等待 VS 死锁 死锁处理策略 二. 死锁预防破坏互斥条件破坏不可剥夺条件破坏请求并保持条件破坏循环等待条件 三. 死锁的避免系统安全状态银行家算法 四. 死锁检测和解除死锁检测…

Mysql注意事项(一)

Mysql注意事项&#xff08;一&#xff09; 最近回顾了一下MySQL&#xff0c;发现了一些MySQL需要注意的事项&#xff0c;同时也作为学习笔记&#xff0c;记录下来。–2020年05月13日 1、通配符* 检索所有的列。 不建议使用 通常&#xff0c;除非你确定需要表中的每个列&am…

微软研发致胜策略 06:学无止境

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1994 年发布。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Debugging the Development Process》&#xff0c;这本书详细阐述了软件开发过程中的常见问题及其解决方案&a…

【运维】软件运维方案(2024word完整版)

1. 文档介绍 2. 人员与责任 3. 运维过程内容 4. 运维资源 5. 运维服务规划保障 6. 事件处置 7. 质量改进 8. 运维边界及内容 获取方式&#xff1a; 本文末个人名片直接获取。

2024年技校大数据实验室建设及大数据实训平台整体解决方案

随着信息技术的迅猛发展&#xff0c;大数据已成为推动产业升级和社会进步的重要力量。为适应市场需求&#xff0c;培养高素质的大数据技术人才&#xff0c;技校作为职业教育的重要阵地&#xff0c;亟需加强大数据实验室的建设与实训平台的打造。本方案旨在提出一套全面、可行的…

宿舍生活新升级:智能指纹锁的便捷体验(嘉立创EDA设计)

宿舍生活新升级&#xff1a;智能指纹锁的便捷体验 引言 宿舍生活总是充满挑战和乐趣&#xff0c;但有时也会因为一些小事情而变得复杂。比如&#xff0c;忘记带钥匙或者需要频繁地给室友开门。随着科技的发展&#xff0c;智能设备逐渐走进我们的生活&#xff0c;为日常带来便…

土耳其媒体发稿深化项目投放战略-脱颖而出

土耳其媒体发稿深化项目投放战略-脱颖而出 一、土耳其媒体的发展概况 土耳其拥有丰富的媒体资源&#xff0c;其中包括许多知名的新闻机构和周刊。随着互联网的普及和信息传播方式的变革&#xff0c;土耳其媒体不断调整发展策略&#xff0c;通过深化项目投放和多元化传播&…

代码随想录——一和零(Leetcode474)

题目链接 0-1背包 class Solution {public int findMaxForm(String[] strs, int m, int n) {// 本题m&#xff0c;n为背包两个维度// dp[i][j]:最多右i个0和j个1的strs的最大子集大小int[][] dp new int[m 1][n 1];// 遍历strs中字符串for(String str : strs){int num0 …

JESD204B学习与仿真

平台&#xff1a;vivado2018.3 芯片&#xff1a;xcku115-flva1517-2-i 场景&#xff1a;在高速ADC和DAC芯片中&#xff0c;有使用源同步的时钟和数据同步传输的方式&#xff0c;但是需要在逻辑内部对其进行校准。如果使用jesd204b接口传输数据&#xff0c;设计人员不需要了解…