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)
相关推荐
心软且酷丶3 分钟前
leetcode:面试题 17.01. 不用加号的加法(python3解法)
python·算法·leetcode
李老头探索12 分钟前
深入理解 Java Set 集合:原理、应用与高频面试题解析
java·开发语言
翔云 OCR API15 分钟前
手机号认证接口、C++API核验、实名认证
开发语言·c++
明月与玄武29 分钟前
JMeter 如何并发执行 Python 脚本
python·jmeter执行python
SoraLuna36 分钟前
「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现
开发语言·macos·ui·华为·harmonyos
是十一月末1 小时前
Opencv实现Sobel算子、Scharr算子、Laplacian算子、Canny检测图像边缘
人工智能·python·opencv·计算机视觉
爱lv行1 小时前
安装和配置 Apache 及 PHP
开发语言·php·apache
向宇it1 小时前
【从零开始入门unity游戏开发之——unity篇04】unity6基础入门——场景窗口(Scene)和层级窗口(Hierarchy)介绍
开发语言·unity·c#·游戏引擎
凌肖战1 小时前
python3中的字典推导式
python
豌豆花下猫1 小时前
Python 潮流周刊#84:2024 年 Python 的最佳实践(摘要)
后端·python·ai