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

目录

主要角色

优点

缺点

适用场景

示例代码

普通写法:

策略模式:

总结对比


责任链模式(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)

总结对比

特性 使用责任链模式 未使用责任链模式
解耦性 高,每个审批角色独立,解耦 低,审批逻辑集中在一个类中,耦合度高
扩展性 高,新增审批角色很容易 低,新增审批角色时需要修改主流程类代码
灵活性 高,可以动态调整审批顺序,修改逻辑简单 低,顺序固定,修改流程较麻烦
代码维护 容易维护,符合开闭原则,修改不影响其他部分 随着流程复杂化,代码维护变得困难
简洁性 结构稍复杂,但清晰易懂,易于扩展 代码简单,但流程扩展时容易变得臃肿和复杂
相关推荐
小王子1024几秒前
设计模式Python版 组合模式
python·设计模式·组合模式
linwq82 小时前
设计模式学习(二)
java·学习·设计模式
小王子10241 天前
设计模式Python版 桥接模式
python·设计模式·桥接模式
Cikiss1 天前
「全网最细 + 实战源码案例」设计模式——桥接模式
java·后端·设计模式·桥接模式
纪元A梦2 天前
Java设计模式:行为型模式→观察者模式
java·观察者模式·设计模式
荣--2 天前
DAB实现中用到的主要设计模式
设计模式·dab
mofei121382 天前
Python设计模式 - 组合模式
python·设计模式·组合模式
小王子10242 天前
设计模式Python版 抽象工厂模式
python·设计模式·抽象工厂模式
利刃大大2 天前
【C++】设计模式详解:单例模式
c++·单例模式·设计模式
小小工匠2 天前
设计模式 - 行为模式_Template Method Pattern模板方法模式在数据处理中的应用
设计模式·模板方法模式