设计模式:责任链模式——行为型模式

目录

主要角色

优点

缺点

适用场景

示例代码

普通写法:

策略模式:

总结对比


责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求发送者与接收者之间的耦合关系。这个模式将请求沿着处理链传递,直到有一个对象处理该请求为止。

主要角色

  • Handler(抽象处理者):定义一个处理请求的接口。通常包含一个后继处理者的引用,并提供设置后继的方法。

  • ConcreteHandler(具体处理者) :实现了处理请求的具体逻辑,如果能够处理请求,则处理它;如果不能处理,则将请求转发给链中的下一个处理者;if-else内置于处理者中

  • Client(客户端):构造责任链并发起请求。

优点

  1. 降低耦合性:发送请求的对象不需要知道具体的处理者,甚至无需知道有多少个处理者。

  2. 灵活的处理顺序:可以动态调整链中对象的顺序,从而决定请求的处理顺序。

  3. 增强了可扩展性:增加新的处理者只需要继承处理者接口并实现自己的处理逻辑即可。

缺点

  1. 请求可能得不到处理:如果责任链上的所有处理者都无法处理请求,可能会导致请求得不到处理。

  2. 可能导致性能问题:如果责任链很长,可能需要经过多次传递才能找到合适的处理者,导致性能问题。

适用场景

  • 有多个对象可以处理同一个请求,且具体处理者事先未知或不固定。

  • 希望在不明确指定接收者的情况下,向多个对象中的一个提交请求。

  • 可以动态地指定能够处理请求的对象集合。

示例代码

需求:审批流程,不同金额对应不同级别的审批流程

普通写法:
复制代码
class ApprovalProcess:
    def approve(self, amount):
        if amount <= 1000:
            return f"经理批准了金额申请 {amount}"
        elif amount <= 5000:
            return f"财务部门批准了金额申请 {amount}"
        else:
            return f"CEO批准了金额请求 {amount}"


# 客户端代码
approval = ApprovalProcess()
amount = 2000
result = approval.approve(amount)
print(result)
策略模式:
复制代码
# 抽象处理者
class ApprovalHandler:
    # 设置后继的方法
    def set_next(self, handler):
        self.next_handler = handler
        return handler

    def handle(self, amount):
        if self.next_handler:
            return self.next_handler.handle(amount)
        return "金额未获批准"


# 具体处理者: 经理 每个审批角色独立
class ManagerApprovalHandler(ApprovalHandler):
    def handle(self, amount):
        # 如果能够处理请求,则处理它;如果不能处理,则将请求转发给链中的下一个处理者
        # if-else内置于处理者中
        if amount <= 1000:
            return f"经理批准了金额申请 {amount}"
        else:
            return super().handle(amount)


# 具体处理者: 财务部门 每个审批角色独立
class FinanceApprovalHandler(ApprovalHandler):
    def handle(self, amount):
        # 如果能够处理请求,则处理它;如果不能处理,则将请求转发给链中的下一个处理者
        # if-else内置于处理者中
        if amount <= 5000:
            return f"财务部门批准了金额申请 {amount}"
        else:
            return super().handle(amount)


# 具体处理者: CEO 每个审批角色独立
class CEOApprovalHandler(ApprovalHandler):
    def handle(self, amount):
        return f"CEO批准了金额请求 {amount}"


if __name__ == '__main__':
    # 客户端代码
    manager_handler = ManagerApprovalHandler()
    finance_handler = FinanceApprovalHandler()
    ceo_handler = CEOApprovalHandler()

    # 建立审批链------调整审批顺序简单
    manager_handler.set_next(finance_handler).set_next(ceo_handler)

    amount = 2000

    # 启动审批链
    result = manager_handler.handle(amount)
    print(result)

总结对比

特性 使用责任链模式 未使用责任链模式
解耦性 高,每个审批角色独立,解耦 低,审批逻辑集中在一个类中,耦合度高
扩展性 高,新增审批角色很容易 低,新增审批角色时需要修改主流程类代码
灵活性 高,可以动态调整审批顺序,修改逻辑简单 低,顺序固定,修改流程较麻烦
代码维护 容易维护,符合开闭原则,修改不影响其他部分 随着流程复杂化,代码维护变得困难
简洁性 结构稍复杂,但清晰易懂,易于扩展 代码简单,但流程扩展时容易变得臃肿和复杂
相关推荐
东阳马生架构6 小时前
Sentinel源码—8.限流算法和设计模式总结二
算法·设计模式·sentinel
冰茶_8 小时前
C#中常见的设计模式
java·开发语言·microsoft·设计模式·微软·c#·命令模式
Niuguangshuo9 小时前
Python 设计模式:访问者模式
python·设计模式·访问者模式
不当菜虚困9 小时前
JAVA设计模式——(七)代理模式
java·设计模式·代理模式
RationalDysaniaer11 小时前
Go设计模式-观察者模式
观察者模式·设计模式·golang
千千寰宇11 小时前
[设计模式/Java] 设计模式之解释器模式【27】
数据库·设计模式
麓殇⊙11 小时前
设计模式-- 原型模式详解
设计模式·原型模式
电子科技圈12 小时前
XMOS空间音频——在任何设备上都能提供3D沉浸式空间音频且实现更安全地聆听
经验分享·设计模式·性能优化·计算机外设·音视频
智想天开12 小时前
11.原型模式:思考与解读
设计模式·原型模式
XiaoLeisj12 小时前
【设计模式】深入解析代理模式(委托模式):代理模式思想、静态模式和动态模式定义与区别、静态代理模式代码实现
java·spring boot·后端·spring·设计模式·代理模式·委托模式