• 【Python笔记-设计模式】责任链模式


    一、说明

    旨在将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。

    (一) 解决问题

    将请求的发送者和接受者解耦,并使请求随着处理对象链传递,优化系统内部处理逻辑

    (二) 使用场景

    • 当程序需要使用不同方式处理不同种类请求, 而且请求类型和顺序预先未知时
    • 当必须按顺序执行多个处理者时
    • 当一个对象需要在运行时动态地确定其处理对象时

    二、结构

    1. 处理者(Handler)声明了所有具体处理者的通用接口。该接口通常仅包含单个方法用于请求处理,但有时其还会包含一个设置链上下个处理者的方法。
    2. 基础处理者(BaseHandler)是一个可选的类,你可以将所有处理者共用的样本代码放置在其中。通常情况下,该类中定义了一个保存对于下个处理者引用的成员变量。客户端可通过将处理者传递给上个处理者的构造函数或设定方法来创建链。该类还可以实现默认的处理行为:确定下个处理者存在后再将请求传递给它。
    3. 具体处理者(ConcreteHandlers)包含处理请求的实际代码。每个处理者接收到请求后,都必须决定是否进行处理,以及是否沿着链传递请求。处理者通常是独立且不可变的,需要通过构造函数一次性地获得所有必要地数据。
    4. 客户端(Client)可根据程序逻辑一次性或者动态地生成链。值得注意的是,请求可发送给链上的任意一个处理者,而非必须是第一个处理者。

    三、伪代码

    1. #!/usr/bin/env python
    2. # -*- coding: UTF-8 -*-
    3. __doc__ = """
    4. 责任链模式
    5. 例:一个产品生产流水线,需要三个环节:生产、质检、包装。每个环节只能由对应的工人处理,如果无法处理则传递给下一个环节处理。
    6. """
    7. from abc import ABC, abstractmethod
    8. class Worker(ABC):
    9. """抽象处理类"""
    10. @abstractmethod
    11. def handle_product(self, product):
    12. pass
    13. @abstractmethod
    14. def set_next_worker(self, worker):
    15. pass
    16. class Producer(Worker):
    17. """具体处理类"""
    18. def __init__(self):
    19. self.next_worker = None
    20. def set_next_worker(self, worker):
    21. self.next_worker = worker
    22. def handle_product(self, product):
    23. if product.get("process") == "produce":
    24. print("生产商正在生产产品")
    25. elif self.next_worker:
    26. self.next_worker.handle_product(product)
    27. class Inspector(Worker):
    28. """具体处理类"""
    29. def __init__(self):
    30. self.next_worker = None
    31. def set_next_worker(self, worker):
    32. self.next_worker = worker
    33. def handle_product(self, product):
    34. if product.get("process") == "inspect":
    35. print("检验员正在检验产品")
    36. elif self.next_worker:
    37. self.next_worker.handle_product(product)
    38. class Packer(Worker):
    39. """具体处理类"""
    40. def __init__(self):
    41. self.next_worker = None
    42. def set_next_worker(self, worker):
    43. self.next_worker = worker
    44. def handle_product(self, product):
    45. if product.get("process") == "pack":
    46. print("包装商正在包装产品")
    47. elif self.next_worker:
    48. self.next_worker.handle_product(product)
    49. if __name__ == "__main__":
    50. """
    51. 生产商正在生产产品
    52. 检验员正在检验产品
    53. 包装商正在包装产品
    54. """
    55. producer = Producer()
    56. inspector = Inspector()
    57. packer = Packer()
    58. producer.set_next_worker(inspector)
    59. inspector.set_next_worker(packer)
    60. product1 = {"process": "produce"}
    61. product2 = {"process": "inspect"}
    62. product3 = {"process": "pack"}
    63. producer.handle_product(product1)
    64. producer.handle_product(product2)
    65. producer.handle_product(product3)

    四、优缺点

    优点

    • 降低耦合度:将请求的发送者和接收者解耦,每个处理对象只需关注自己的处理逻辑,不需要知道整个处理链的结构,降低了对象之间的耦合度。
    • 灵活性:允许动态地添加、移除或修改处理对象,可以根据需要调整处理链的结构,提高了系统的灵活性。
    • 简化对象之间的交互:将处理对象的关系组织成一条链,简化了对象之间的交互,使得系统更易于理解和维护。
    • 可扩展性:允许动态地添加新的处理对象,因此可以很容易地扩展系统的功能,满足不断变化的需求。

    缺点

    • 性能问题:责任链模式可能会导致请求在整个处理链上传递,直到有一个处理对象处理请求为止,如果处理链过长或者处理对象之间的处理时间不均匀,可能会影响系统的性能。
    • 调试困难:责任链模式将请求的处理分散在多个处理对象中,可能会导致调试时比较困难,特别是处理链比较长的情况下。

    【Python笔记】设计模式-CSDN博客

  • 相关阅读:
    求职应聘找工作的同学,在线测评怎么过?
    10.22 - 每日一题 - 408
    【负荷预测】布谷鸟(CS)算法优化BP神经网络的负荷及天气预测(Matlab代码实现)
    JetPack之LifeCycle设计模式与解耦艺术的极致运用
    backtrace - 线程调用栈
    python中使用缓存技术
    TP4333移动电源芯片
    某堡垒机SQL注入漏洞
    java设计模式之---单例模式
    【mysql 高级】explain的使用及explain包含字段的含义
  • 原文地址:https://blog.csdn.net/weixin_44904331/article/details/136258431