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)
相关推荐
じ☆冷颜〃39 分钟前
分布式系统中网络技术的演进与异构融合架构(HFNA)
笔记·python·物联网·设计模式·架构·云计算
夜思红尘3 小时前
算法--双指针
python·算法·剪枝
人工智能训练3 小时前
OpenEnler等Linux系统中安装git工具的方法
linux·运维·服务器·git·vscode·python·ubuntu
散峰而望3 小时前
【算法竞赛】C++函数详解:从定义、调用到高级用法
c语言·开发语言·数据结构·c++·算法·github
冷凝雨3 小时前
复数乘法(C & Simulink)
c语言·开发语言·信号处理·simulink·dsp
CoderCodingNo4 小时前
【GESP】C++五级真题(贪心思想考点) luogu-B4071 [GESP202412 五级] 武器强化
开发语言·c++·算法
0和1的舞者4 小时前
Spring AOP详解(一)
java·开发语言·前端·spring·aop·面向切面
MoonBit月兔4 小时前
年终 Meetup:走进腾讯|AI 原生编程与 Code Agent 实战交流会
大数据·开发语言·人工智能·腾讯云·moonbit
智航GIS4 小时前
8.2 面向对象
开发语言·python
小小星球之旅4 小时前
CompletableFuture学习
java·开发语言·学习