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)
相关推荐
Susea&35 分钟前
数据结构初阶:双向链表
c语言·开发语言·数据结构
_x_w1 小时前
【17】数据结构之图及图的存储篇章
数据结构·python·算法·链表·排序算法·图论
pianmian11 小时前
arcgis几何与游标(1)
开发语言·python
-曾牛1 小时前
【LangChain4j快速入门】5分钟用Java玩转GPT-4o-mini,Spring Boot整合实战!| 附源码
java·开发语言·人工智能·spring boot·ai·chatgpt
冬天vs不冷1 小时前
SpringBoot条件注解全解析:核心作用与使用场景详解
java·spring boot·python
nanzhuhe1 小时前
python中参数前**的含义
开发语言·python
wt_cs2 小时前
身份认证C#集成方案-数字时代身份证实名认证利器
开发语言·c#
hello_ejb32 小时前
聊聊Spring AI Alibaba的PdfTablesParser
windows·python·spring
Kairo_012 小时前
秘密任务 2.0:如何利用 WebSockets + DTOs 设计实时操作
python
ghost1432 小时前
Python自学第2天:条件语句,循环语句
开发语言·python·学习