大话设计模式——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);
    }

    @Override
    public 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);
    }

    @Override
    public 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);
    }
}

在这里插入图片描述

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue简单使用四(计算属性、过滤器、侦听器和生命周期)

目录 计算属性&#xff1a; 侦听器&#xff1a; 过滤器&#xff1a; 生命周期 &#xff1a; 计算属性&#xff1a; 查看arrs这个数组的长度&#xff1a; 输出结果&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><me…

Windows终端添加git bash

环境&#xff1a;windows11 终端&#xff1a;windows terminal git bash默认的界面不太好看&#xff0c;添加到终端会比较好用 步骤 打开 windows terminal&#xff0c;在向下箭头 点击 设置左侧栏 点击 “添加新配置文件”&#xff0c;如下图配置&#xff0c;主要修改项&…

2024年Flink CDC 实时同步数据(MySQL到MySQL)

#准备工作# 看到一下图片说明执行成功&#xff01;&#xff01;&#xff01; 异常处理及分析&#xff1a; Could not execute SQL statement. Reason: org.apache.flink.sql.parser.impl.ParseException: Encountered "\connector\" at line 21, column 3. Was expec…

PostgreSQL强势崛起,选择它还是MySQL

大家好&#xff0c;关系型数据库&#xff08;RDBMS&#xff09;作为数据管理的基石&#xff0c;自数据仓库兴起之初便扮演着核心角色&#xff0c;并在数据科学的发展浪潮中持续发挥着价值。即便在人工智能和大型语言模型&#xff08;LLM&#xff09;日益成熟的今天&#xff0c;…

Linux使用C语言实现Socket编程

Socket编程 这一个课程的笔记 相关文章 协议 Socket编程 高并发服务器实现 线程池 网络套接字 socket: &#xff08;电源&#xff09;插座&#xff08;电器上的&#xff09;插口&#xff0c;插孔&#xff0c;管座 在通信过程中, 套接字是成对存在的, 一个客户端的套接字, 一个…

医疗器械UDI码的DI和PI什么意思

一、理解医疗器械UDI 医疗器械的UDI码是Unique Device Identifier Code的缩写&#xff0c;意为唯一设备识别码。 医疗器械的UDI码是唯一设备识别码&#xff0c;由两个部分组成&#xff1a;DI和PI。 1.1、DI 理解 DI&#xff08;Device Identifier&#xff0c;设备标识符&am…

19、矩阵-螺旋矩阵

思路: 这道题主要是对空间上有所思考&#xff0c;每次转一圈上右下左各减少一层。不妨设top&#xff0c;right&#xff0c;down&#xff0c;left&#xff0c;每次旋转一圈 top&#xff0c;right--&#xff0c;down--&#xff0c;left 代码如下&#xff1a; class Solution …

【炒股Zero To Hero】MACD金叉死叉到底是否有效,加上这个指标回报率增加197倍

移动平均收敛散度&#xff08;MACD - Moving Average Convergence Divergence&#xff09;是一种趋势跟踪动量指标&#xff0c;显示了证券价格的两个移动平均之间的关系。它用于识别趋势的方向和强度&#xff0c;属于技术分析中振荡器的一类。 MACD如何衡量股票及其趋势 有两…

蜘蛛池规矩采集优化与运用技巧 什么是蜘蛛池/SEO蜘蛛池怎么养?

作为一名网络内容修改&#xff0c;我常常需求从各种网站上收集文章并转载到咱们的网站上。而在这个过程中&#xff0c;我深深感受到了蜘蛛池对我的帮助。今日&#xff0c;我就来共享一下我对蜘蛛池收集规矩的亲自感受。 本文 虚良SEO 原创&#xff0c;转载保留链接&#xff01…

【电子通识】热风枪的结构与使用方法

热风枪的结构 热风枪是专门用来拆焊、焊接贴片元器件和贴片集成电路的焊接工具&#xff0c;它主要由主机和热风焊枪两大部分构成。 热风枪主要有电源开关、风速设置、温度设置、热风连接等部件组成。根据不同品牌和价位的热风枪&#xff0c;有一些功能齐全的也集成了烙铁功能。…

绿联 安装火狐浏览器(Firefox),支持访问路由器

绿联 安装火狐浏览器&#xff08;Firefox&#xff09;&#xff0c;支持访问路由器 1、镜像 linuxserver/firefox:latest 前置条件&#xff1a;动态公网IP。 已知问题&#xff1a; 直接输入中文时&#xff0c;不能完整输入&#xff0c;也可能输入法无法切换到中文&#xff0c;可…

Post表单提交后端接不到参数

项目背景&#xff1a; 框架&#xff1a;Springboot 版本&#xff1a;1.5.6.REAEASE 问题描述 Postman通过表单提交请求时后端接不到值 原因分析&#xff1a; 启动项中注入其他Bean时取名叫dispatcherServlet&#xff0c;当发现http接口无法访问时&#xff0c;原开发人员又…

albef论文学习

首先要知道vit是啥东西。vit就是transformer模型在图像领域的运用。 transformer模型原本是用于自然语言的&#xff0c;encoder和decoder接受的都是文字。vit把图像分割成很多个小块&#xff0c;把各个小块拉长当成向量来用&#xff0c;接下来就是一样的。最后接一个全连接层做…

(学习日记)2024.04.12:UCOSIII第四十节:软件定时器函数接口讲解

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

编程技巧(五) mysql中查询将行转为列逗号隔开拼接

让清单成为一种习惯 互联网时代的变革,不再是简单的开发部署上线,持续,正确,安全地把事情做好尤其重要;把事情做好的前提是做一个可量化可执行的清单,让工程师就可以操作的清单而不是专家才能操作: 设定检查点 根据节点执行检查程序操作确认或边读边做 二者选其一不要太…

CSS导读 (元素显示模式)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 三、CSS的元素显示模式 3.1 什么是元素显示模式 3.2 块元素 3.3 行内元素 3.4 行内块元素 3.5 元素…

马斯克预言:下一代Grok 3模型将需10万Nvidia H100 GPU进行训练|TodayAI

特斯拉首席执行官兼xAI创始人埃隆马斯克对人工通用智能&#xff08;AGI&#xff09;的发展做出了一些大胆的预测&#xff0c;并讨论了AI行业面临的挑战。他预测&#xff0c;AGI可能在明年或2026年之前超越人类智能&#xff0c;但训练AGI将需要极大数量的处理器&#xff0c;进而…

priority_queue的使用以及模拟实现

前言 上一期我们对stack和queue进行了使用的介绍&#xff0c;以及对底层的模拟实现&#xff01;以及容器适配器做了介绍&#xff0c;本期我们在来介绍一个容器适配器priority_queue&#xff01; 本期内容介绍 priority_queue的使用 仿函数介绍 priority_queue的模拟实现 什么…

2024年人工智能路线图

今天分享的是人工智能专题系列深度研究报告&#xff1a;《人工智能专题&#xff1a;2024年人工智能路线图》。 秘书制定部门的人工智能战略优先事项和政策&#xff0c;并且是关键的对话者与私营部门、联邦机构、州官员&#xff0c;以及主要的国际同行。这部长在白宫人力资源委员…