大话设计模式——19.责任链模式(Chain of Responsibility Pattern)

简介

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
主要有两个核心行为:1.处理请求;2.将请求传递到下一节点

UML图:

在这里插入图片描述

应用场景
  • Apache Tomcat 对 Encoding 编码的处理,Springboot 中的拦截器和过滤器链
  • 存在多个对象可以处理同一个请求,但具体哪个请求进行处理由运行时动态决定
  • 日志级别:debugger -> info -> warning -> error

示例

金融行业的一些风控规则,受限于一些政策会经常进行调整,不同的交易金额有不同的风控策略进行处理

  1. Client:
public class Request {/*** 金额*/private double money;/*** 请求类型*/private String requestType;public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}public String getRequestType() {return requestType;}public void setRequestType(String requestType) {this.requestType = requestType;}
}
  1. Handler:
public abstract class RiskManager {/*** 防控策略*/protected String riskName;/*** 上级防控*/protected RiskManager superior;public RiskManager(String riskName) {this.riskName = riskName;}/*** 处理请求** @param request*/public abstract void handleRequest(Request request);public RiskManager getSuperior() {return superior;}public void setSuperior(RiskManager superior) {this.superior = superior;}
}

一级防控:

public class FirstRiskManager extends RiskManager {public FirstRiskManager(String riskName) {super(riskName);}@Overridepublic void handleRequest(Request request) {if ("线上".equals(request.getRequestType()) && 2000 > request.getMoney()) {System.out.println("支付方式:" + request.getRequestType() + ",支付金额:" + request.getMoney() + ",防控策略:" + riskName);} else {if (null != superior) {// 触发其他防控策略superior.handleRequest(request);}}}
}

二级防控:

public class SecondRiskManager extends RiskManager {public SecondRiskManager(String riskName) {super(riskName);}@Overridepublic void handleRequest(Request request) {if ("线上".equals(request.getRequestType()) && 5000 > request.getMoney()) {System.out.println("支付方式:" + request.getRequestType() + ",支付金额:" + request.getMoney() + ",防控策略:" + riskName);} else {System.out.println("支付方式:" + request.getRequestType() + ",支付金额:" + request.getMoney() + ",防控策略:限制交易!");}}
}
  1. 运行
public class Main {public static void main(String[] args) {FirstRiskManager firstRiskManager = new FirstRiskManager("一级防控,正常交易");SecondRiskManager secondRiskManager = new SecondRiskManager("二级防控,重点监控");firstRiskManager.setSuperior(secondRiskManager);Request request = new Request();request.setRequestType("线上");// 一级防控request.setMoney(1200);firstRiskManager.handleRequest(request);// 二级防控request.setMoney(4000);firstRiskManager.handleRequest(request);// 最终防控request.setMoney(6000);firstRiskManager.handleRequest(request);}
}

在这里插入图片描述

总结

  • 优点
    • 客户只需要将请求发送到职责链上即可,无需关心请求的具体细节,降低了耦合度
    • 通过改变链内的调动次序,可以动态新增或删除处理类,提高了可维护性
    • 可以根据需求新增请求处理类,提高了可扩展性,同时满足开闭原则
    • 每个请求处理类只服务于自己的责任范围,满足单一职责原则
  • 缺点
    • 要把整个流程走完,可能需要很多的职责对象,可能会造成系统性能降低,同时产生大量的细粒度职责对象,并且出现问题不方便调试
    • 不能保证请求一定被接收

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

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

相关文章

“AI”科普丨Transformer架构图解最强教程!

今天给大家分享一篇关于深度学习模型Transformer的文章。我愿称之为讲解Transformer模型最好的文章。 文章内容主要介绍 Transformer 模型的具体实现: Transformer整体架构 Transformer概览 引入张量 自注意力机制Self-Attention 多头注意力机制Mutil-Head Att…

算法四十天-删除排序链表中的重复元素

删除排序链表中的重复元素 题目要求 解题思路 一次遍历 由于给定的链表是排好序的,因此重复的元素在链表中的出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。 具体地,我们从指针cur指向链表的头节…

光子学,能否催生下一代计算革命?

研究和技术开发在光子计算领域正迅猛增长,其产品也逐渐融入市场。这一新兴的计算技术革命预计将对科学家和工程师的研究能力产生深远影响。 光子技术在加速大规模计算基础设施的数据处理速度方面展现出巨大的潜力,同时有可能显著降低网络及通讯的能耗。该…

解析大语言模型训练三阶段

大语言模型的训练过程一般包括3个阶段:预训练(Pre-training)、SFT(有监督的微调,Supervised-Finetuning)以及RLHF(基于人类反馈的强化学习,Reinforcement Learning from Human Feedb…

第一届长城杯初赛部分wp(个人解题思路)

目录 Black web babyrsa2 APISIX-FLOW cloacked 本人不是很擅长ctf,这只是我自己做出的西部赛区部分题的思路,仅供参考 Black web 访问http://192.168.16.45:8000/uploads/1711779736.php 蚁剑连接 访问/var/www/html/u_c4nt_f1nd_flag.php babyr…

艾瑞咨询最新发布《2024年中国采购数字化平台行业研究报告》,企企通市场份额稳居第一!

导读 根据艾瑞咨询统计,以SRM和ERP背景的厂商为主,企企通以18.5%的市场份额,稳居国内采购数字化平台市场第一位置。 近日,国内知名研究机构艾瑞咨询发布《2024年中国采购数字化平台行业研究报告》(以下简称”《报告》…

HJ1 字符串最后一个单词的长度(字符串,import java.util.HashSet;)

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别int num sc.nextInt();boolean[] in new boolean[…

docker部署coredns服务器

创建文件夹 mkdir /coredns/config/添加一个CoreDNS配置文件 cat >/coredns/config/Corefile<<EOF.:53 {forward . 114.114.114.114:53log}EOF启动docker docker run -d --name coredns --restartalways \-v /coredns/config:/etc/coredns \-p 53:53/udp \regist…

Android 接入MQTT服务器

加入MQTT库 加入库可以直接下载对应的jar包&#xff0c;也可以在build.gradle里导入&#xff0c;然后加载进入。 这里直接在build.gradle加库 dependencies {implementation(libs.appcompat)implementation(libs.material)implementation(libs.activity)implementation(libs…

clickhouse深入浅出

基础知识原理 极致压缩率 极速查询性能 列式数据库管理 &#xff0c;读请求多 大批次更新或无更新 读很多但用很少 大量的列 列的值小数值/短字符串 一致性要求低 DBMS&#xff1a;动态创建/修改/删除库 表 视图&#xff0c;动态查/增/修/删&#xff0c;用户粒度设库…

控ID型sd生成 - AI写真

1.lora 2.dreambooth 3.串联型&#xff1a;facechain 4.串联型&#xff1a;easyphoto 5.instanceid 6.photomaker 7.ip-adapter-faceid

关于Java 中的Optional的一些事

开始 定义一个实体类User,实现get、set方法 public class User {String name;String sex;public User(String name, String sex) {this.name name;this.sex sex;}public String getName() {return name;}public void setName(String name) {this.name name;}public String…

Xinstall:专业的App下载量统计工具,让推广效果可衡量

在移动互联网时代&#xff0c;App的下载量是衡量一个应用受欢迎程度的重要指标。然而&#xff0c;很多开发者和广告主在推广App时&#xff0c;都面临着一个共同的问题&#xff1a;如何准确统计App的下载量&#xff1f;这不仅关系到推广效果的评估&#xff0c;还直接影响到广告R…

DC-1渗透测试复现

DC-1渗透测试复现 目的&#xff1a; 获取最高权限以及5个flag 过程&#xff1a; 信息打点-cms框架漏洞利用-数据库-登入admin-提权 环境&#xff1a; 攻击机&#xff1a;kali(192.168.85.136) 靶机&#xff1a;DC_1(192.168.85.131) 复现&#xff1a; 一.信息收集 扫…

Python爬虫基础快速入门

目录 前言一、什么是爬虫二、快速编写一个爬虫2.1 爬虫需要用到的库2.2 搭建项目工程2.3 安装三方库2.4 案例编写 三、爬虫实战3.1 目标分析3.2 清洗数据 四、代码改进 前言 本博客旨在分享爬虫技术相关知识&#xff0c;仅供学习和研究之用。使用者在阅读本博客的内容时&#…

Qt/C++推流组件使用说明

2.1 网络推流 公众号&#xff1a;Qt实战&#xff0c;各种开源作品、经验整理、项目实战技巧&#xff0c;专注Qt/C软件开发&#xff0c;视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发。 公众号&#xff1a;Qt入门和进阶&#xff0c;专门介绍Qt/C相关知识点学…

镗床工作台开槽的作用

镗床工作台开槽的作用主要有以下几点&#xff1a; 改善工作台的刚度和稳定性&#xff1a;开槽可以增加工作台的刚度&#xff0c;使其能够承受更大的切削力和振动力&#xff0c;提高工作台的稳定性。 方便工件夹紧和定位&#xff1a;开槽可用于夹紧和定位工件&#xff0c;使其能…

【DM8】序列

创建序列 图形化界面创建 DDL CREATE SEQUENCE "TEST"."S1" INCREMENT BY 1 START WITH 1 MAXVALUE 100 MINVALUE 1;参数&#xff1a; INCREMENT BY < 增量值 >| START WITH < 初值 >| MAXVALUE < 最大值 >| MINVALUE < 最小值…

PostgreSQL入门到实战-第十弹

PostgreSQL入门到实战 PostgreSQL数据过滤(三)官网地址PostgreSQL概述PostgreSQL中OR操作理论PostgreSQL中OR实操更新计划 PostgreSQL数据过滤(三) 了解PostgreSQL OR逻辑运算符以及如何使用它来组合多个布尔表达式。 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列…

MQ之————如何保证消息的可靠性

MQ之保证消息的可靠性 1.消费端消息可靠性保证&#xff1a; 1.1 消息确认&#xff08;Acknowledgements&#xff09;&#xff1a; 消费者在接收到消息后&#xff0c;默认情况下RabbitMQ会自动确认消息&#xff08;autoAcktrue&#xff09;。为保证消息可靠性&#xff0c;可以…