【设计模式】之责任链模式

embedded/2024/9/24 0:25:10/

系列文章目录


文章目录

系列文章目录

前言

一、什么是责任链模式

二、有什么使用场景呢

三、如何使用责任链模式

总结


前言

上次我们了解了设计模式中的策略模式,今天我们继续学习责任链模式。🌈


一、什么是责任链模式

为请求创建了一个接受者对象的链。为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。举个通俗易懂的例子,就是我们撸串的时候,我们一般都是从签的上方一个一个往下撸的,责任链模式就跟这个类似。

二、有什么使用场景呢

责任链模式因为可以灵活地配置处理者的顺序和数量,而不需要修改客户端代码。所以责任链模式在项目实战中用处广泛。

  • JDK中的异常处理机制就使用了责任链模式。当某个方法抛出异常时,首先会在方法内部寻找try-catch块来捕获异常,如果没有找到,就会将异常向上一层抛出,直至找到合适的catch块处理。
  • Spring框架中的拦截器链机制也使用了责任链模式。拦截器链是通过将各个拦截器按照一定的顺序连接起来形成一个链条,在请求处理过程中按顺序调用每个拦截器的相应方法来完成一系列操作。

责任链模式还可以用于处理日志记录、用户权限验证等场景。

三、如何使用责任链模式

我给大家举一个简单的例子,如:大学请假流程,我就以 院长-->导员-->任课老师这个流程来给大家解释。

首先,我们定义一个请假的接口,当然,用抽象类也阔以。

/**
* 说明: 请假接口
*/public interface TakeLeave {boolean doTakeLeave(User user);
}

然后呢,院长、导员、任课老师,分别去实现这个接口

/*院长*/
@Order(0)
@Component
public class deanHandler implements TakeLeave{@Overridepublic boolean doTakeLeave(User user) {if (user.getReason() == null || user.getReason().isEmpty()) {System.out.println("院长:没有请假理由,拒绝请假!");return false;}System.out.println("院长:已审核,提交给导员。");return true;}
}
/*导员*/
@Component
@Order(100)
public class GuideHandler implements TakeLeave{@Overridepublic boolean doTakeLeave(User user) {if (!user.getReason().contains("事") && !user.getReason().contains("病")) {System.out.println("导员:理由不充分,拒绝请假!");return false;}System.out.println("导员:已审核,提交给任课老师。");return true;}
}
/*任课老师*/
@Component
@Order(200)
public class LecturerHandler implements TakeLeave{@Overridepublic boolean doTakeLeave(User user) {System.out.println("任课老师:已同意学生请假。");return true;}
}

大家可以注意到,我Order里面优先级的数字设置的特别大,设置大一点可以方便后续我们可以继续扩展这个链,比如说:校验的时候,有用户名校验order(1)、手机校验order(2),后续扩展的时候,如过你想在添加一种校验规则,就只能在后面添加,如果有一些场景需要添加在两者中间,我们就需要重新修改order里面的数字。

设置责任链的协调者

@Component
public class LeaveHandlerChain {@Autowiredprivate List<TakeLeave> leaveHandlers;public boolean handleLeaveRequest(User user) {for (TakeLeave handler : leaveHandlers) {if (!handler.doTakeLeave(user)) {// 如果任何一个处理者返回false,则整个链结束return false;}}return true;}
}

进行测试

 @Autowiredprivate LeaveHandlerChain leaveHandlerChain;@Testvoid test1(){User user = new User();user.setName("小杰不秃头");user.setReason("家里有事,需要请假");//user.setReason("");boolean isApproved  = leaveHandlerChain.handleLeaveRequest(user);if (isApproved) {System.out.println("请假已批准!");} else {System.out.println("请假被拒绝!");}}/*
院长:已审核,提交给导员。
导员:已审核,提交给任课老师。
任课老师:已同意学生请假。
请假已批准!
*/
/*
院长:没有请假理由,拒绝请假!
请假被拒绝!
*/

总结

  • 优点:请求的发送者和接受者解耦;可以控制执行顺序;符合开闭原则单一职责原则
  • 缺点:对比较长的职责链,请求处理可能会涉及多个处理对象,性能会受到影响;增加了客户端的复杂性,可能会造成循环调用。

大家不可盲目为了使用设计模式而去使用设计模式,一定要结合具体的业务场景,选择最优的解决方法。

今天的分享就到这里,我们下个设计模式见🥳


http://www.ppmy.cn/embedded/28733.html

相关文章

企微SOP新风尚:构建高效、精准的营销流程

随着企业微信&#xff08;企微&#xff09;在营销领域的广泛应用&#xff0c;越来越多的企业开始重视企微SOP&#xff08;Standard Operating Procedure&#xff0c;标准操作流程&#xff09;的建设。一个完善的企微SOP不仅能够帮助企业实现营销流程的标准化和规范化&#xff0…

TDengine写入2000万数据查询体验

最近在寻找时序数据库&#xff0c;想应用在公司的项目上。 上一篇文章实验了InfluxDB:windows上使用influx2.7学习,还学习了flux语言&#xff0c;最后发现宽表查询比较困难&#xff0c;就放弃了&#xff0c;于是决定试试国产时序数据库TDengine 参考 官方文档&#xff1a;htt…

QT-QTCreator环境配置

准备工作&#xff1a; 下载QT: 链接&#xff1a;https://pan.baidu.com/s/1prJcsC4DGqhKiXvLuPQFVA?pwd60b3 提取码&#xff1a;60b3下载WindowsKits&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1QNiS3HpbH5M5kXx5AhkqnQ?pwde2h8 提取码&#xff1a;e2h8安装的…

基于Lucene的搜索引擎设计与实现:技术总结与展望

论文、答辩资料、源代码见下 引言 在大数据时代背景下&#xff0c;如何快速有效地从海量网络信息中检索出有价值的信息&#xff0c;是当前技术领域面临的一大挑战。本次毕业设计的核心工作是设计并实现一个基于Lucene的搜索引擎&#xff0c;旨在提高信息检索的效率和准确性。…

Spring Security介绍(三)过滤器(2)自定义

除了使用security自带的过滤器链&#xff0c;我们还可以自定义过滤器拦截器。 下面看下自定义的和security自带的执行顺序。 一、总结 1、自定义过滤器&#xff1a; 一般自定义fliter都是&#xff1a; import lombok.extern.slf4j.Slf4j; import org.springframework.ster…

mac用Homebrew安装MySQL并配置远程登录

1. 简介 MySQL 是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;后被 Oracle 公司收购。MySQL 使用 SQL&#xff08;Structured Query Language&#xff09;作为查询语言&#xff0c;并提供了强大的功能和性能…

c#word文档:1.创建空白Word文档及保存/2.添加页内容...

---创建空白Word文档 --- &#xff08;1&#xff09;创建一个名为OfficeOperator的类库项目。引用操作Word的.NET类库 &#xff08;2&#xff09;定义用于操作Word的类WordOperator1。添加引用Microsoft.Office.Interop.Word命名空间。 &#xff08;3&#xff09;为WordOper…

基于python的天气网站数据爬取和可视化分析项目

基于python的天气网站数据爬取和可视化分析项目 2024.03-2024.04项目职责&#xff1a;策划者和执行者 项目地址:项目描述&#xff1a;本项目的目的是为了通过爬虫技术来爬取中国气象网的天气数据&#xff0c;并且使用pandas,pyecharts进行 数据可视化&#xff0c;分析…