阅读 92

设计模式: 责任链模式

别称: 职责链模式,命令链,CoR, Chain Of Command, Chain of Responsibility

作用: 责任链模式属于行为设计模式中的一种,其作用是将收到的请求沿着处理链进行调用处理,链上的每一处理者都可以对请求进行操作处理,或者传递给下一个处理者。比如:

image.png

场景 假设你正在开发一个商城系统(好像举例就容易举到商城上去,谁能告诉我为什么!!!),user对于订单的操作只需要登录认证即可。但是除此之外,管理者也有对全部订单的处理权限。

那么一个最基本的版本的处理模型就如下:

image.png

但是随着你的商城慢慢被越来越多的人使用,由于过于简单的访问检查设计,暴露出来的问题也越来越多,需要添加的检查步骤也会逐渐变多:同一请求的接口幂等设计问题(一般返回缓存中的结果即可),请求数据的真实性检查,用户白名单黑名单等等。那么,这中间的检查步骤会渐渐的变得复杂起来,检查部分的代码也会变得越来越多,可维护性与可读性也变得越来越低。

此时,就该我们的责任链模式闪亮登场了:

解决方案: 我们可以将每一个检查步骤封装为一个类,所有的这些类组合起来形成一个链。链上的每一个处理者对象都应该有一个对下一个处理对象的引用。每一个处理者对象都应该可以对请求进行检查,同时决定是直接跳出处理(检查失败) 还是交给下一个处理者继续检查。所有的处理者只关心自己的检查逻辑,而不关心其他检查者的检查内容。

代码实现

# 责任链模式 from __future__ import annotations from abc import ABC, abstractmethod from typing import Any, Optional class BaseHandler(ABC):     @abstractmethod     def set_next_handler(self, handler: BaseHandler) -> BaseHandler:         pass          @abstractmethod     def handle(self, request: Any) -> Optional[str]:         pass         class Handler(BaseHandler):     def __init__(self):         self.next_handler = None          def set_next_handler(self, handler: BaseHandler) -> BaseHandler:         self.next_handler = handler         return handler     @abstractmethod     def handle(self, request: Any) -> str:         if self.next_handler:             return self.next_handler.handle(request)         return None class LoginHandler(Handler):     def handle(self, request: map)->str:         if request["Login"]:             return super().handle(request)         return "the request are not login"      class AccessHandler(Handler):     def handle(self, request: map) -> str:         if request["Access"]:             return super().handle(request)         return "the request can not access the order"      class DataHandler(Handler):     def handle(self, request: map) -> str:         if request["Data"]:             return super().handle(request)         return "the request data are not origin" def TestChain(handler: BaseHandler) -> None:     request1 = {         "Login" : True,         "Access" : True,         "Data" : True,     }     request2 = {         "Login" : False,         "Access" : True,         "Data" : True,     }     request3 = {         "Login" : True,         "Access" : False,         "Data" : True,     }     request4 = {         "Login" : True,         "Access" : True,         "Data" : False,     }     requests = [request1, request2, request3, request4]     for request in requests:         result = handler.handle(request)         if result:             print(result)         else:             print("Access Ok") if __name__ == "__main__":     loginHandler = LoginHandler()     dataHandler = DataHandler()     accessHandler = AccessHandler()     dataHandler.set_next_handler(loginHandler).set_next_handler(accessHandler)     print("origin chain: login -> access")     TestChain(loginHandler)     print("\n\nnew chain: data -> login -> access")     TestChain(dataHandler) 复制代码

运行结果如下:

origin chain: login -> access Access Ok the request are not login the request can not access the order Access Ok new chain: data -> login -> access Access Ok the request are not login the request can not access the order the request data are not origin


作者:豆浆和西红柿克星
链接:https://juejin.cn/post/7021505035297095693

文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐