设计模式-责任链设计模式

核心思想

  • 客户端发出一个请求,链上的对象都有机会来处理这一请求,而客户端不需要知道谁是具体的处理对象
  • 让多个对象都有机会处理请求,避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条调用链,并沿着这条链传递该请求,直到有一个对象处理它才终止
  • 两个核心行为:一是处理请求,二是将请求传递到下一节点

场景使用

  • 在请求处理者不明确的情况下向多个对象中的一个提交请求
  • 如果有多个对象可以处理同一个请求,但是具体由哪个对象处理是由运行时刻动态决定的,这种对象就可以使用职责链模式
  • SpringBoot里面的拦截器、过滤器链

在这里插入图片描述

优缺点

优点

  • 客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递
  • 通过改变链内的调动它们的次序,允许动态地新增或者删除处理类,比较很方便维护
  • 增强了系统的可扩展性,可以根据需要增加新的请求处理类,满足开闭原则
  • 每个类只需要处理自己该处理的工作,明确各类的责任范围,满足单一职责原则

缺点

  • 处理都分散到了单独的职责对象中,每个对象功能单一,要把整个流程处理完
  • 不能保证请求一定被接收
  • 如果链路比较长,系统性能将受到一定影响,而且在进行代码调试时不太方便

代码示例

业务示意图

在这里插入图片描述

配置 Request 类


public class Request {/*** 类别*/private String requestType;/*** 金额*/private int money;public String getRequestType() {return requestType;}public void setRequestType(String requestType) {this.requestType = requestType;}public int getMoney() {return money;}public void setMoney(int money) {this.money = money;}
}

请求类型枚举 RequestType

public enum RequestType {/*** 转账*/TRANSFER,/*** 提现*/CASH_OUT;
}

风控抽象类 RiskControlManager


public abstract class RiskControlManager {protected  String name;/*** 更严格的风控策略*/protected RiskControlManager superior;public RiskControlManager(String name){this.name = name;}/*** 设置更严格的风控策略* @param superior*/public void setSuperior(RiskControlManager superior){this.superior = superior;}/*** 处理请求* @param request*/public abstract void handlerRequest(Request request);}

初级风控 FirstRiskControlManager


public class FirstRiskControlManager extends RiskControlManager {public FirstRiskControlManager(String name) {super(name);}/***  1000元以内可以直接处理* @param request*/@Overridepublic void handlerRequest(Request request) {if(RequestType.valueOf(request.getRequestType())!=null && request.getMoney()<=1000){System.out.println("普通操作,输入支付密码即可");System.out.println(name+":"+request.getRequestType() + ", 金额:"+request.getMoney() +" 处理完成");}else {//下个节点进行处理if(superior!=null){superior.handlerRequest(request);}}}
}

中级风控


public class SecondRiskControlManager extends RiskControlManager {public SecondRiskControlManager(String name) {super(name);}/*** 处理 1千到1万之间* @param request*/@Overridepublic void handlerRequest(Request request) {if(RequestType.valueOf(request.getRequestType())!=null && request.getMoney()>1000 && request.getMoney()<10000){System.out.println("稍大额操作,输入支付密码+短信验证码即可");System.out.println(name+":"+request.getRequestType() + ", 金额:"+request.getMoney() +" 处理完成");}else {//下个节点进行处理if(superior!=null){superior.handlerRequest(request);}}}
}

高级风控 ThirdRiskControlManager


public class ThirdRiskControlManager extends RiskControlManager {public ThirdRiskControlManager(String name) {super(name);}@Overridepublic void handlerRequest(Request request) {if(RequestType.valueOf(request.getRequestType())!=null && request.getMoney()>10000){System.out.println("大额操作,输入支付密码+验证码+人脸识别 ");System.out.println(name+":"+request.getRequestType() + ", 金额:"+request.getMoney() +" 处理完成");}else {//下个节点进行处理if(superior!=null){superior.handlerRequest(request);}}}
}

测试

public static void main(String[] args) {RiskControlManager firstControlManager = new FirstRiskControlManager("初级风控");RiskControlManager secondControlManager = new SecondRiskControlManager("中级风控");RiskControlManager thirdControlManager = new ThirdRiskControlManager("高级风控");//形成调用链firstControlManager.setSuperior(secondControlManager);secondControlManager.setSuperior(thirdControlManager);//使用Request request1 = new Request();request1.setRequestType(RequestType.CASH_OUT.name());request1.setMoney(21000);firstControlManager.handlerRequest(request1);}

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/144713.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统管理:虚拟机Kylin OS安装

目录 一、理论 1.Kylin OS 二、实验 1.虚拟机Kylin OS安装准备阶段 2.安装Kylin OS 3.进入系统 一、理论 1.Kylin OS &#xff08;1&#xff09;简介 麒麟操作系统&#xff08;Kylin OS&#xff09;亦称银河麒麟&#xff0c;是由中国国防科技大学、中软公司、联想公司…

[备忘]WindowsLinux上查看端口被什么进程占用|端口占用

Windows上 查看端口占用&#xff1a; netstat -aon|findstr <端口号> 通过进程ID查询进程信息 tasklist | findstr <上一步查出来的进程号> 图例&#xff1a; Linux 上 查看端口占用&#xff1a; netstat -tuln | grep <端口号> lsof -i:<端口号&…

【目标检测】Co-DETR:ATSS+Faster RCNN+DETR协作的先进检测器(ICCV 2023)

论文&#xff1a;DETRs with Collaborative Hybrid Assignments Training 代码**&#xff1a;https://github.com/Sense-X/Co-DETR 文章目录 摘要一、简介二、本文方法2.1.概述2.2.协同混合分配训练2.3. 定制的正 Query 生成2.4. Co-DETR为何有效1、丰富编码器的监督2、通过减少…

微信小程序数据交互------WXS的使用

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 1.数据库连接 数据表结构&#xff1a; 数据测式&#xff1a; 2.后台配置 pom.xml <?xml version&quo…

智慧矿山:让AI算法提高未戴安全带识别率!

未穿戴安全带识别AI算法&#xff0c;作为智慧矿山的重要应用之一&#xff0c;不仅可以有效提高矿山工作人员的安全意识&#xff0c;还可以降低事故发生的概率。然而&#xff0c;识别准确率的提高一直是该算法面临的挑战之一。为了解决这个问题&#xff0c;研究人员不断努力探索…

vue3里面vant组件的标签页使用?

一、绑一个v-model事件 二、让activeName的初始为0也就是默认是显示第一个标签页的下标 三、给标签页下面的东西进行一个判断 想让哪个优先显示就把哪个判断作为初始值存入

【iOS】UITableView总结(Cell的复用原理、自定义Cell、UITableViewCell协议方法)

UITableView 列表的特点&#xff1a; 数据量大样式较为统一通常需要分组垂直滚动通常可视区只有一个 -> 视图的复用 UITableViewDataSource UITableView作为视图&#xff0c;只负责展示&#xff0c;协助管理&#xff0c;不管理数据 需要开发者为UITableView提供展示所需…

FPGA【紫光语法】

寄存器数据类型&#xff1a; reg 默认为 1 bit wide&#xff0c;如果超过 1 bit&#xff0c;则需要 range declaration 设置 reg 的位宽integer 默认位宽为 32 bit&#xff0c;不允许有 range declarationtime 默认位宽为 64 bit&#xff0c;不允许有 range declarat…

.net6部署到linux上(CentOS Linux 7)

目录 一、先在linux上配置.net环境 添加 Microsoft 包存储库 安装 SDK 安装运行时 检查 SDK 版本可使用终端查看当前安装的 .NET SDK 版本。 打开终端并运行以下命令。 二、创建.net6 mvc项目 并发布 创建项目 修改默认端口 打包发布到文件夹 运行打包项目查看项目是否…

非平稳信号分析和处理、STFT的瞬时频率研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Android Studio快速实现Flutter应用的国际化和多语言支持

文章目录 Flutter实现国际化和多语言支持添加依赖库Android Studio 安装flutter Intl插件项目初始化增加语言app中使用国际化在应用中切换语言&#xff1a;运行应用 总结easy_localization 插件intl 包Flutter GetX 包flutter_i18n 插件JSON 文件 Flutter实现国际化和多语言支持…

【C语言】每日一题(旋转数组)

旋转数组&#xff0c;链接奉上 目录 方法:创建额外的数组&#xff1a;整体思路&#xff1a;代码实现&#xff1a; 数组反转&#xff1a;整体思路&#xff1a;代码实现&#xff1a;小插曲&#xff1a; 方法: 创建额外的数组&#xff1a; 整体思路&#xff1a; 创建一个额外的…