首页 > 其他分享 >设计模式:责任链模式——行为型模式

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

时间:2025-01-18 22:31:44浏览次数:3  
标签:请求 处理 self 模式 责任 amount handler 审批 设计模式

目录

主要角色

优点

缺点

适用场景

示例代码

普通写法:

策略模式:

总结对比


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

总结对比

特性使用责任链模式未使用责任链模式
解耦性高,每个审批角色独立,解耦低,审批逻辑集中在一个类中,耦合度高
扩展性高,新增审批角色很容易低,新增审批角色时需要修改主流程类代码
灵活性高,可以动态调整审批顺序,修改逻辑简单低,顺序固定,修改流程较麻烦
代码维护容易维护,符合开闭原则,修改不影响其他部分随着流程复杂化,代码维护变得困难
简洁性结构稍复杂,但清晰易懂,易于扩展代码简单,但流程扩展时容易变得臃肿和复杂

标签:请求,处理,self,模式,责任,amount,handler,审批,设计模式
From: https://blog.csdn.net/fengjingping11/article/details/145126018

相关文章

  • JSP面向专利知识产权的电子交易模式研究与商务平台bw89z--程序+源码+数据库+调试部署+
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表技术要求:开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用SpringBoot,Spring技术主数据库使用MySQL开题报告内容一、研究背景与意义随着全球经济的深......
  • 编程练习:编写一个监听者模式类
    监听者模式(ObserverPattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系。当一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。这种模式非常适合用于事件驱动的系统,例如GUI框架、消息队列等。在本文中,我们将通过编写一个简单的监听者模式类 Obser......
  • 掌握设计模式--观察者模式
    观察者模式(ObserverPattern)观察者模式(ObserverPattern)是一种行为设计模式,它定义了对象间的一对多依赖关系,使得当一个对象状态发生改变时,所有依赖于它的对象都会自动收到通知并更新。主要组成部分主题(Subject):主题是被观察的对象,它维护一个观察者列表。当它的状态发生改......
  • 【设计模式与体系结构】结构型模式-装饰模式
    简介装饰模式(DecoratorPattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。装饰模式是用组合的方式将装饰对象和被装饰对象组合在一起,当调用装饰后的对象的方法时,实际是......
  • 了解ESP32睡眠模式及其功耗
    转载自:https://lastminuteengineers.com/esp32-sleep-modes-power-consumption/InsightIntoESP32SleepModes&TheirPowerConsumption TheESP32isundeniablyaworthycompetitortomanyWiFi/MCUSoCs,outperformingtheminbothperformanceandprice.......
  • 【渗透 Tips】解决Edge的IE模式下无法抓包情况
    问题说明        在日常渗透中往往避免不了站点的环境适配问题,有一些站点只能使用IE模式访问,此时便会想着可能使用内置proxy插件代理至抓包软件即可,事实上这并不能很好解决。        如上图所示,即使挂上了yakit代理也无济于事;同时,尝试打开开发者模式进行抓包会......
  • libsql 多租户namespace模式试用
    libsql支持基于db分离的多租户模式,但是需要开启namespace能力,以下是一个简单说明以及测试开启namepace我基于docker-compose部署,目前docker部署的缺少环境变量支持,我基于了cmd运行,核心是--enable-namespacesdocker-composeservices:db1:image:ghcr.io/turs......
  • 算法2-25 有序单链表删除重复元素(附加代码模式)
    题目描述根据一个递增的整数序列构造有序单链表,删除其中的重复元素本题是附加代码模式,主函数main和打印链表的代码会自动附加在同学们提交的代码后面,请同学们在提交的时候注释附加代码。附加代码如下:void PrintList(const List &list){    Node *p = list->nex......
  • 【日志分析】从手动解析到智能检测:日志异常模式挖掘全解
    网罗开发(小红书、快手、视频号同名)  大家好,我是展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、HarmonyOS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源......
  • C# 设计模式之行为型 —— 责任链模式
    行为型设计模式11种行为型设计模式,是最大的一个家族了。行为型设计模式关注的是对象和行为的分离---直白点说,就是方法到底放在哪里?会看到频繁的逻辑(方法)转移责任链模式,简直就是行为型设计模式无止境的行为转移。1.Interpreter(解释器)2.TemplateMethod(模板方法)3.C......