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

23种设计模式之责任链模式

文章目录

    • 23种设计模式之责任链模式
    • 主要角色和结构
    • 工作原理
    • 简单实现 - 学生成绩打印
    • 优点
    • 责任链 - 缺点
    • 责任链 - 应用场景
    • 责任链模式在Spring中的使用

23种设计模式之责任链模式

责任链设计模式是一种行为型设计模式,它允许多个对象依次处理一个请求,直到有一个对象处理这个请求为止。

主要角色和结构

  1. 抽象处理者(Handler)
    • 定义了处理请求的接口,其中包含一个指向下一个处理者的引用。
    • 通常有一个抽象方法来处理请求,子类需要实现这个方法。
  2. 具体处理者(ConcreteHandler)
    • 实现了抽象处理者的接口,具体处理请求。
    • 如果自己无法处理请求,则将请求转发给下一个处理者。

工作原理

当一个请求产生时,它会被传递给责任链中的第一个处理者。这个处理者会尝试处理请求,如果它能够处理,就处理并结束请求的传递;如果不能处理,它会将请求传递给下一个处理者,如此继续,直到请求被处理或者到达责任链的末尾。

简单实现 - 学生成绩打印

学生的成绩打印,成绩大于80分-优秀,成绩60~80分合格,成绩小于60分不合格。

在这里插入图片描述

abstract class ScoreHandler {protected ScoreHandler nextHandler;public void setNextHandler(ScoreHandler nextHandler) {this.nextHandler = nextHandler;}public abstract void handleScore(int score);
}class ExcellentScoreHandler extends ScoreHandler {@Overridepublic void handleScore(int score) {if (score > 80) {System.out.println("成绩优秀");} else if (nextHandler!= null) {nextHandler.handleScore(score);}}
}class PassScoreHandler extends ScoreHandler {@Overridepublic void handleScore(int score) {if (score >= 60 && score <= 80) {System.out.println("成绩及格");} else if (nextHandler!= null) {nextHandler.handleScore(score);}}
}class FailScoreHandler extends ScoreHandler {@Overridepublic void handleScore(int score) {if (score < 60) {System.out.println("成绩不及格,需重修");} else if (nextHandler!= null) {nextHandler.handleScore(score);}}
}

使用:在使用时需要创建责任链。也就是需要设置下一个处理器setNextHandler

public class Main {public static void main(String[] args) {ScoreHandler excellentHandler = new ExcellentScoreHandler();ScoreHandler passHandler = new PassScoreHandler();ScoreHandler failHandler = new FailScoreHandler();excellentHandler.setNextHandler(passHandler);passHandler.setNextHandler(failHandler);excellentHandler.handleScore(75);excellentHandler.handleScore(90);excellentHandler.handleScore(45);}
}

在这个例子中,根据学生的成绩,不同的处理者会打印出相应的成绩状态。如果一个处理者不能处理当前成绩,它会将请求传递给下一个处理者。

执行结果

成绩及格
成绩优秀
成绩不及格,需重修

优点

  1. 降低了对象之间的耦合度:请求的发送者和接收者之间没有直接的耦合关系,发送者只需要将请求发送到责任链上,而不需要知道具体由哪个对象来处理请求。
  2. 增强了系统的灵活性:可以动态地添加或删除处理者,以及改变处理者的顺序,而不影响系统的其他部分。
  3. 提高了代码的可维护性:每个处理者只负责自己的处理逻辑,代码的职责更加清晰,易于维护和扩展。

责任链 - 缺点

  1. 存在请求可能不被处理的风险,因为无法确保责任链中的某个处理者一定会处理该请求。
  2. 当责任链过长时,会带来较大的性能开销,因为请求需要依次经过多个处理者,可能导致处理时间延长。
  3. 调试过程较为复杂,由于请求在多个处理者之间传递,出现问题时难以快速确定具体的问题节点。

责任链 - 应用场景

  1. 异常处理:可通过责任链模式,将不同类型的异常依次交由特定的处理者进行处理,确保异常得到妥善解决。
  2. 中间件:在中间件的实现中,责任链模式能让不同的中间件组件依次对请求进行处理,增强系统的灵活性和可扩展性。
  3. GUI:在图形用户界面系统中,事件可以通过责任链进行传递和处理,不同的组件可根据自身能力处理特定事件。
  4. 工作流:适用于工作流场景,不同的任务节点可以组成责任链,依次处理任务,直至完成整个工作流程。

责任链模式在Spring中的使用

1、DispatcherServlet

DispatcherServlet处理请求的过程中就用到了责任链模式。

在 Spring MVC 中,当一个请求到达DispatcherServlet后,会经过一系列的拦截器(HandlerInterceptor)进行处理。这些拦截器组成了一个责任链,每个拦截器可以在请求处理的不同阶段进行预处理(preHandle)、后处理(postHandle)以及请求完成后的处理(afterCompletion)。如果某个拦截器的preHandle方法返回false,则后续的拦截器和处理器将不会被执行。

这种方式使得请求的处理更加灵活,可以方便地添加、删除或调整拦截器的顺序,而不影响核心的请求处理逻辑。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Ubuntu基本命令的熟悉和使用
  • MongoDB创建用户教程
  • OpenCV结构分析与形状描述符(8)点集凸包计算函数convexHull()的使用
  • 相机光学(三十六)——光圈
  • Unity数据持久化 之 使用Excel.DLL读写Excel表格
  • 暴力数据结构之优先级队列的解析及其模拟实现(C++)
  • python读取excel
  • Flask如何处理POST请求
  • 两个月冲刺软考——逻辑地址与物理地址的转换(例题+讲解);文件类型的考点
  • 【C++】手动实现nique_ptr智能指针
  • 解决AbortController中断请求无法再次请求
  • 招聘网站项目
  • Docker in Docker 实践 on mac
  • 跨越技术壁垒:EasyCVR为何选择支持FMP4格式,重塑视频汇聚平台标准
  • Jenkins+docker+springboot 一键自动部署项目步骤
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • avalon2.2的VM生成过程
  • C++入门教程(10):for 语句
  •  D - 粉碎叛乱F - 其他起义
  • ECS应用管理最佳实践
  • exif信息对照
  • jQuery(一)
  • Mysql优化
  • Netty源码解析1-Buffer
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • select2 取值 遍历 设置默认值
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 订阅Forge Viewer所有的事件
  • 番外篇1:在Windows环境下安装JDK
  • 关于extract.autodesk.io的一些说明
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何胜任知名企业的商业数据分析师?
  • 使用 Docker 部署 Spring Boot项目
  • 新版博客前端前瞻
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #java学习笔记(面向对象)----(未完结)
  • #考研#计算机文化知识1(局域网及网络互联)
  • (20050108)又读《平凡的世界》
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (回溯) LeetCode 131. 分割回文串
  • (三)docker:Dockerfile构建容器运行jar包
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • 、写入Shellcode到注册表上线
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .Net Core和.Net Standard直观理解
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET WPF 抖动动画
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器