设计模式-责任链模式

ops/2024/12/31 6:30:56/

一、简介

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,用于将请求的发送者与接收者解耦,使多个处理对象都有机会处理该请求。这些处理对象通过形成一条链式结构依次处理请求,直到某个对象能够完成处理或处理链结束。

责任链模式的核心思想是:将多个可能处理请求的对象连接成一条链,沿着链传递请求,直至某个处理对象处理它或链的末端。

应用场景

  • 请求需要被多个对象处理:比如击鼓传花、事件冒泡机制、权限校验、日志记录等。
  • 请求的处理逻辑需要灵活扩展:可以动态地增加或移除处理器。
  • 避免请求的发送者和接收者之间的强耦合:发送者无需指定接收者,接收者可以灵活变化。

二、优缺点

优点
  1. 请求解耦:请求发送者和处理者解耦,降低代码耦合度。
  2. 灵活性高:可以动态组合和扩展处理链。
  3. 单一职责:每个处理器只关注自身的逻辑,符合开闭原则。
缺点
  1. 性能问题:如果链很长,可能会影响性能。
  2. 调试困难:请求的最终处理者不容易追踪,可能需要额外的日志记录。
  3. 请求未被处理:不能保证请求一定会被链中的某个处理者接收。

三、实际应用

场景

需求:针对不同用户群体设计多种校验规则:

  • A群体:仅需校验手机验证码。
  • B群体:需同时校验手机验证码和用户年龄。

要求根据用户群体的不同动态应用对应的校验规则,实现灵活性和扩展性。

代码实现:

步骤一:构造handler 

java">public abstract class AbstractCheckHandler {public abstract void handler(CheckVO checkVO);public abstract int getCode();
}

 步骤二 实现handler 进行不同的规则校验

java">public class PhoneCheckHandler extends AbstractCheckHandler {@Overridepublic void handler(CheckVO checkVO) {if (checkVO.getVerificationCode() == null) {throw new RuntimeException("验证码不能为空!!");}if (!Integer.valueOf("0000").equals(checkVO.getVerificationCode())) {throw new RuntimeException("验证码错误!!");}}@Overridepublic int getCode() {return 1;}
}
java">public class UserCheckHandler extends AbstractCheckHandler {private static Integer LEGAL_AGE = 18;@Overridepublic void handler(CheckVO checkVO) {if (checkVO.getUserId() == null) {throw new RuntimeException("用户不能为空");}if (LEGAL_AGE >= checkVO.getAge()) {throw new RuntimeException("用户未满十八岁");}}@Overridepublic int getCode() {return 0;}
}

 步骤三  指定链路的传递方式  通过codeList进行控制

java">
public class CheckHandlerExecution {private final List<AbstractCheckHandler> handlers;public CheckHandlerExecution(){this.handlers = new ArrayList<>();this.handlers.add(new UserCheckHandler());this.handlers.add(new PhoneCheckHandler());}public CheckHandlerExecution(List<AbstractCheckHandler> handlers) {this.handlers = handlers;}public void handle(List<Integer> codeList, CheckVO checkVO) {for (AbstractCheckHandler handler : handlers) {int code = handler.getCode();if (codeList.contains(code)) {handler.handler(checkVO);}}}
}

 步骤四  代码验证 针对不同用户群体通过list中的code进行控制校验 ,list可以配置在数据库中实现手动配置,从而进行动态校验

java">public class CorCheckTest {public static void main(String[] args) {CheckVO vo = new CheckVO();vo.setAge(16);vo.setUserId(123456);vo.setAreaCode("+86");vo.setVerificationCode(0000);CheckHandlerExecution execution = new CheckHandlerExecution();// 只执行手机号验证execution.handle(Arrays.asList(1), vo);// 同时执行手机号和用户年龄验证execution.handle(Arrays.asList(0, 1), vo);}
}


http://www.ppmy.cn/ops/145930.html

相关文章

Excel 列名称转换问题 Swift 解答

文章目录 摘要描述题解答案Swift 实现代码&#xff1a;题解代码分析示例测试及结果 时间复杂度空间复杂度总结未来展望参考资料 摘要 本篇文章将通过 Swift 编程语言解答一个常见的算法问题&#xff1a;给定一个整数 columnNumber&#xff0c;将其转换为 Excel 表中的列名称。…

TP5 动态渲染多个Layui表格并批量打印所有表格

记录&#xff1a; TP5 动态渲染多个Layui表格每个表格设置有2行表头&#xff0c;并且第一行表头在页面完成后动态渲染显示内容每个表格下面显示统计信息可点击字段排序一次打印页面上的所有表格打印页面上多个table时,让每个table单独一页 后端代码示例&#xff1a; /*** Nod…

帝国cms电脑pc站url跳转到手机站url的方法

本文讲解一下帝国cms电脑网站跳转到手机动态网站和手机静态网站的方法,笔者以古诗词网 www.gushichi.com为例&#xff0c;为大家介绍操作步骤。方法一&#xff1a;帝国pc站跳转到手机静态站 1、假设我们有帝国cms 电脑网站www.XXX.com&#xff0c;手机网站m.XXX.com &#xf…

龙智出席2024零跑智能汽车技术论坛,分享功能安全、需求管理、版本管理、代码扫描等DevSecOps落地实践

龙智快讯 2024年12月5日&#xff0c;由零跑和盖世汽车主办的“2024零跑智能汽车技术论坛”在杭州零跑总部圆满落幕。此次技术论坛聚焦AI语言大模型、AUTOSAR AP平台、DevOps、端到端自动驾驶等热点话题展开探讨&#xff0c;旨在推动智能汽车技术的创新与发展。 龙智作为国内领先…

SpringCloudAlibaba实战入门之路由网关Gateway断言(十二)

上一节课中我们初步讲解了网关的基本概念、基本功能,并且带大家实战体验了一下网关的初步效果,这节课我们继续学习关于网关的一些更高级有用功能,比如本篇文章的断言。 一、网关主要组成部分 上图中是核心的流程图,最主要的就是Route、Predicates 和 Filters 作用于特定路…

用 ElementUI 的日历组件 Calendar 自定义渲染

文章目录 需求分析1. 页面渲染2. 获取页面上的开始日期和结束日期3. 总的代码 需求 之前实现过一版用 ElementPlus 的日历组件 Calendar 自定义渲染&#xff0c;是在 Vue3 项目中实现的&#xff0c;现在需求在 Vue2 中也实现一版 分析 1. 页面渲染 <el-calendar v-model&q…

韩国首尔阿里云200M不限流量轻量云主机测试报告

今天发现阿里云的轻量云 韩国首尔有机器 就买了测试一下&#xff0c;有想看这个机器特点的可以查看此报告 也希望能帮助到你。 报告时间&#xff1a;2024-12-28 22:28:34 CST 脚本版本&#xff1a;v2024-11-09 ##########################################################…

AIDD - 人工智能药物设计 -使用 Butina 模块对相似化合物进行聚类

使用 Butina 模块对相似化合物进行聚类 RDKit 提供了一个基于化合物相似性的聚类模块。其中一种是名为 Butina 模块的聚类算法&#xff0c;它可以通过准备化合物之间的 距离矩阵来对相似的化合物进行分类。 RDKit 提供了一个基于化合物相似性的聚类模块。其中一种是名为 But…