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

设计模式的艺术-职责链模式

行为型模式的名称、定义、学习难度和使用频率如下表所示:

1.如何理解职责链模式

  1. 最常见的职责链是直线型,即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并让请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,实现请求发送者和请求处理者解耦。

  2. 职责链模式(Chain of Responsibility Pattern):避免将请求发送者与接收者耦合在一起,让多个对象都有机会接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式

  3. 职责链模式通过建立一条链来组织请求的处理者。请求将沿着链进行传递,请求发送者无须知道请求在何时、何处以及如何被处理,实现了请求发送者与处理者的解耦。在软件开发中,如果遇到有多个对象可以处理同一请求时可以应用职责链模式。例如,在Web应用开发中创建一个过滤器(Filter)链来对请求数据进行过滤,在工作流系统中实现公文的分级审批等。

  4. 职责链模式的适用场景通常具有以下特点:存在一系列有序的处理步骤或环节,每个环节的处理者具有不同的职责和处理能力,并且处理的顺序和具体的处理者可能会根据情况动态变化。

2.如何理解纯与不纯的职责链模式

  1. 纯的职责链模式

    1. 概念:一个请求必须被链中的某个处理者处理,而且每个处理者要么处理请求,要么将请求传递给下一个处理者,不存在中途终止传递的情况。也就是说,在纯的职责链模式中,请求一定会沿着链传递下去,直到有一个处理者能够处理它为止。

    2. 常见的业务场景:审批流程、消息传递、事件的处理等。

    3. 优点:解耦请求发送者和接收者、增强了系统的灵活性、实现了职责的分离、动态分配职责、提高了代码的可维护性和可扩展性等。

  2. 不纯的职责链模式

    1. 概念:允许某个处理者在处理请求后,停止请求的传递,或者在处理不了请求的情况下也不传递给下一个处理者。这可能导致某些情况下请求得不到处理。

    2. 常见的业务场景:部份可中断的流程、条件性处理、优先级的处理、异步处理的部分场景等。

    3. 优点:提高效率、灵活控制流程、减少不必要的处理

3.职责链模式的优缺点

  1. 优点

    1. 解耦请求者和处理者:使得请求的发送方不需要知道具体由谁来处理请求,降低了它们之间的直接依赖。

    2. 增强了灵活性:可以轻松地添加、删除或重新排列处理者,而无需修改请求发送方的代码。

    3. 提高了系统的可扩展性:新的处理者可以方便地加入到职责链中,以处理新的请求类型或扩展现有功能,符合开闭原则。

    4. 职责分离:每个处理者只关注自己的处理逻辑,职责明确,易于维护和理解。

  2. 缺点

    1. 不能保证请求一定被处理:在纯的职责链模式中,如果所有处理者都无法处理请求,可能会导致请求无人处理;在不纯的模式中,如果控制不当,也可能出现请求被遗漏的情况。

    2. 可能导致性能问题:如果职责链过长,请求的传递和处理可能会带来一定的性能开销。

    3. 如果建链不当,可能会造成循环调用,将导致系统陷入死循环

4.职责链模式的适用场景

  1. 审批流程:如请假申请、费用报销审批等,不同级别的人员按照一定顺序进行审批。

  2. 工作流处理:在复杂的业务流程中,如订单处理流程,包括下单、库存检查、支付、发货等环节,每个环节由不同的处理者负责。

  3. 消息过滤和处理:在消息中间件中,对不同类型、优先级或来源的消息进行过滤和处理。

  4. 任务分配:将任务按照一定规则分配给不同的处理者,每个处理者根据自身条件决定是否接受并处理任务。

以上内容为根据书本内容配合搜索引擎整理得来,目的是为了学习,要是有侵权的情况发生,请联系我,我会立即予以删除,谢谢!

一起成长,人生是马拉松,可以跑得慢,但一定要在路上。


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

相关文章:

  • C语言常用知识结构深入学习
  • OpenCV:高通滤波之索贝尔、沙尔和拉普拉斯
  • 低代码可视化-转盘小游戏可视化-代码生成器
  • python判断字符串是否存在空白、字母或数字
  • 2024 行远自迩,笃行不怠
  • 99.6 金融难点通俗解释:股息率(DV)
  • 解决npm install总是卡在sill idealTree buildDeps不动问题
  • 【java】签名验签防篡改研究测试
  • 解决Python 在 Flask 开发模式下定时任务启动两次的问题
  • C# OpenCV机器视觉:交通标志识别
  • 【Uniapp-Vue3】下拉刷新
  • 最新-CentOS 7 基于1 Panel面板安装 JumpServer 堡垒机
  • maven打包springboot项目出现找不到符号错误
  • k8s 蓝绿发布、滚动发布、灰度发布
  • git和idea重新安装后提交异常
  • 【安当产品应用案例100集】034-安当KSP支持密评中存储数据的机密性和完整性
  • Stable Diffusion 图片背景完美替换
  • 游戏设备升级怎么选?RTX4070独显,ToDesk云电脑更具性价比
  • 仿 RabbitMQ 的消息队列3(实战项目)
  • 深度学习-93-大语言模型LLM之基于langchain的模型IO的输出解析
  • JAVA系统中Spring Boot 应用程序的配置文件:application.yml
  • 监控系统-zabbix
  • JAVA与数据结构-线性表
  • Git处理冲突详解
  • 如何把jupyter的一个.ipynb文件的多个单元格cell合并为1个cell
  • 深度学习之使用yolo网络训练kitti数据集:kitti数据集转换为VOC格式