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)
相关推荐
lili00124 分钟前
Claude自动修Bug配置优化与避坑指南
java·人工智能·python·bug·ai编程
Vallelonga4 分钟前
Rust 中 unsafe 关键字的语义
开发语言·rust
Szime6 分钟前
靠谱的终端工厂采购电子元器件供应链哪家更适合研发型企业?
人工智能·python
AI砖家9 分钟前
前端 JavaScript 异步处理全方案详解:从回调到 Observable
开发语言·前端·javascript
思麟呀12 分钟前
C++工业级日志项目(七)日志器核心
linux·开发语言·c++·windows
2401_8734794012 分钟前
如何用IP离线库批量清洗订单IP,自动标注省市区?
开发语言·网络·python
py小王子12 分钟前
期刊复现 | Python实现扇形小提琴图
python·期刊图片复现
lcj251118 分钟前
vector的基本使用 + 手搓成员变量 size capacity begin end operator[] reserve扩容 拷贝构造 赋值析构
开发语言·c++·笔记·面试
GHL28427109029 分钟前
Qt Creator 19.0.0 (Community)下载
开发语言·qt