当前位置: 首页 > article >正文

行为型——责任链模式

责任链模式

责任链模式是一种行为型设计模式,它允许请求沿着处理链传递,直到有一个处理者处理为止。其核心思想是解耦请求发送者与接收者。

特点

  • 解耦处理者与接收者: 发送者无需知道哪一个接收者处理请求,接收者也无需知道请求的细节。
  • 动态构建处理链: 灵活的调整处理者的顺序或增减处理者。
  • 责任明确: 每个处理者只负责处理特定的请求。

模式结构

角色描述
抽象处理者(Handler)定义了处理请求的接口,并且可以访问它的后继者
具体处理者(ConcreteHandler)实现了处理请求的接口,判断是否可以处理该请求,否则将请求传递给它的后继者
客户端(Client)创建处理链,并向链的头部发起请求

简单示例

from abc import ABC, abstractmethod
from typing import Optional


# 处理者抽象类
class Approver(ABC):

    def __init__(self):
        self._successor: Optional[Approver] = None

    def set_successor(self, successor: 'Approver') -> 'Approver':
        self._successor = successor
        return successor

    @abstractmethod
    def handle_request(self, amount: float) -> str:
        pass


# 具体处理者类
class Supervisor(Approver):
    def handle_request(self, amount: str) -> str:
        if amount <= 500:
            return f'Supervisor approved ${amount} Reimbursement.'
        elif self._successor:
            return self._successor.handle_request(amount)
        else:
            return f'${amount} Reimbursement denied.'

class DepartmentManager(Approver):
    def handle_request(self, amount: str) -> str:
        if amount <= 1000:
            return f'Department Manager approved ${amount} Reimbursement.'
        elif self._successor:
            return self._successor.handle_request(amount)
        else:
            return f'${amount} Reimbursement denied.'

class CEO(Approver):
    def handle_request(self, amount: str) -> str:
        if amount <= 10000:
            return f'CEO approved ${amount} Reimbursement.'
        elif self._successor:
            return self._successor.handle_request(amount)
        else:
            return f'${amount} Reimbursement denied.'

# 客户端代码
if __name__ == '__main__':
    supervisor = Supervisor()
    department_manager = DepartmentManager()
    ceo = CEO()
    supervisor.set_successor(department_manager).set_successor(ceo)

    requests = [250, 600, 1250, 10000]
    for amount in requests:
        print(supervisor.handle_request(amount))

    # 结果输出
    # Supervisor approved $250.0 Reimbursement.
    # Department Manager approved $600.0 Reimbursement.
    # CEO approved $1250.0 Reimbursement.
    # 10000 Reimbursement denied.

适用场景

  • 多级请求处理,如审批流程
  • 动态请求处理,如Web框架的中间件
  • 需要按优先级处理请求,如客服系统

优缺点

  • 优点:
    • 减少耦合:处理者与请求者之间解耦,请求者无需知道处理者
    • 符合单一职责和开闭原则
  • 缺点:
    • 请求可能未被处理,需要添加兜底逻辑
    • 调试复杂,链条过长时,对象的状态和处理者顺序有关联,需要跟踪整个链条

http://www.kler.cn/a/612042.html

相关文章:

  • 本地文生图使用插件(Stable Diffusion)
  • MybatisPlus(SpringBoot版)学习第五讲:条件构造器和常用接口
  • poetry install --with aws
  • SQL语言的安全开发
  • 网易邮箱DolphinScheduler迁移实战:从部署到优化,10倍效率提升的内部经验
  • 数据结构6-图
  • 数制——FPGA
  • C++ set容器总结
  • Linux 目录结构(文件系统结构)示例说明
  • 《Spring Cloud Eureka 高可用集群实战:从零构建 99.99% 可靠性的微服务注册中心》
  • 【后端】CDN内容分发网络
  • 美摄科技智能汽车视频延迟摄影解决方案,开启智能出行新视界
  • ESP32S3 WIFI 实现TCP服务器和静态IP
  • 使用 OCRmyPDF 将扫描 PDF 转为可搜索文档和文本文件
  • <sa8650>QCX Camera Channel configuration
  • 如何根据目标网站调整Python爬虫的延迟时间?
  • Postman 版本信息速查:快速定位版本号
  • 量子计算模拟中的测量与噪声建模:基于 3 量子比特系统分析
  • 甘肃旅游服务平台+论文源码视频演示
  • 算法每日一练 (20)