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) 发起请求处理,结果会根据请求方法逐级传递到能够处理该请求的处理器,并返回处理结果。
python 复制代码
class RequestHandler:
    def __init__(self, successor=None):
        self.successor = successor
    
    def 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 GET
    
    def handle(self, request):
        # Handle GET request logic
        return f"Handling GET request for {request['url']}"


class PostRequestHandler(RequestHandler):
    def can_handle(self, request):
        return request['method'] == 'POST'  # Check if the method is POST
    
    def handle(self, request):
        # Handle POST request logic
        return f"Handling POST request for {request['url']}"


class PutRequestHandler(RequestHandler):
    def can_handle(self, request):
        return request['method'] == 'PUT'  # Check if the method is PUT
    
    def handle(self, request):
        # Handle PUT request logic
        return f"Handling PUT request for {request['url']}"


class DeleteRequestHandler(RequestHandler):
    def can_handle(self, request):
        return request['method'] == 'DELETE'  # Check if the method is DELETE
    
    def handle(self, request):
        # Handle DELETE request logic
        return f"Handling DELETE request for {request['url']}"


# Usage
if __name__ == "__main__":
    request_obj = {'method': 'GET', 'url': 'https://example.com'}
    
    # Create handlers
    delete_handler = DeleteRequestHandler()
    put_handler = PutRequestHandler(delete_handler)
    post_handler = PostRequestHandler(put_handler)
    get_handler = GetRequestHandler(post_handler)
    
    # Example usage
    result = get_handler.handle_request(request_obj)
    print(result)
相关推荐
艾米莉亚糖6 分钟前
解决qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed
开发语言·qt·ssl
CryptoRzz16 分钟前
股票数据源对接技术指南:印度尼西亚、印度、韩国
数据库·python·金融·数据分析·区块链
她说彩礼65万22 分钟前
C# 中的锁
开发语言·c#
2302_8097983223 分钟前
【JavaWeb】JDBC
java·开发语言·servlet
胖哥真不错37 分钟前
Python实现NOA星雀优化算法优化卷积神经网络CNN回归模型项目实战
python·cnn·卷积神经网络·项目实战·cnn回归模型·noa星雀优化算法
繁依Fanyi42 分钟前
ImgShrink:摄影暗房里的在线图片压缩工具开发记
开发语言·前端·codebuddy首席试玩官
卓律涤1 小时前
【找工作系列①】【大四毕业】【复习】巩固JavaScript,了解ES6。
开发语言·前端·javascript·笔记·程序人生·职场和发展·es6
xqlily1 小时前
MATLAB安装常见问题解决方案
开发语言·matlab
achene_ql1 小时前
基于QT和FFmpeg实现自己的视频播放器FFMediaPlayer(一)——项目总览
开发语言·qt·ffmpeg
MeyrlNotFound1 小时前
(二十一)Java集合框架源码深度解析
java·开发语言