(十 六)趣学设计模式 之 责任链模式!

news2025/4/6 1:01:21

在这里插入图片描述

目录

    • 一、 啥是责任链模式?
    • 二、 为什么要用责任链模式?
    • 三、 责任链模式的实现方式
    • 四、 责任链模式的优缺点
    • 五、 责任链模式的应用场景
    • 六、 总结

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解命令模式请看: (十 五)趣学设计模式 之 命令模式!
✨更多请看个人主页: 码熔burning

一、 啥是责任链模式?

想象一下,一场激烈的足球比赛 ⚽️。 当球传到你脚下时,你需要判断自己是否能够处理这个球:如果可以,就自己处理;如果不行,就将球传给下一个队友。 球就这样在队员之间传递,直到有人能够处理它。

责任链模式,就是用来解决请求的发送者和多个接收者之间耦合的问题! 它可以将多个处理器组成一条链,并将请求沿着链传递,直到某个处理器能够处理它 🎁。

简单来说,就是把请求像踢皮球一样,在多个处理器之间传递,直到有人能搞定!

  • 你需要处理一个请求,但是不知道哪个处理器能够处理它: 就像你需要将球传给最合适的队友 ⚽️!
  • 你需要动态地添加和删除处理器: 就像你需要根据比赛情况调整球员的位置 🏃!
  • 你需要保证请求一定会被处理: 就像你需要保证球最终会被踢进球门 🥅!

二、 为什么要用责任链模式?

用责任链模式,好处多多 👍:

  • 解耦请求和处理: 请求的发送者不需要知道哪个处理器能够处理它,只需要将请求发送到链上 🤝!
  • 灵活添加和删除处理器: 可以动态地添加和删除处理器,使得代码更加灵活 🤸!
  • 简化代码: 避免大量的 if-else 语句,使得代码更加简洁优雅 💫!
  • 提高代码的可维护性: 将每个处理器的逻辑封装起来,使得代码更加清晰易懂 💡!

三、 责任链模式的实现方式

责任链模式主要包含三个核心概念:

  • 抽象处理者(Handler): 定义了处理请求的接口,并持有下一个处理者的引用 🤝!
  • 具体处理者(ConcreteHandler): 实现了抽象处理者的接口,负责处理特定的请求 ⚙️!
  • 客户端(Client): 创建责任链,并将请求发送到链上 🏭!
// 抽象处理者:审批人
public abstract class Approver {
    protected Approver nextApprover; // 下一个审批人

    public void setNextApprover(Approver nextApprover) {
        this.nextApprover = nextApprover;
    }

    public abstract void approve(int amount); // 审批请求
}

// 具体处理者:主任
public class Director extends Approver {
    @Override
    public void approve(int amount) {
        if (amount <= 1000) {
            System.out.println("主任批准了 " + amount + " 元的报销");
        } else {
            if (nextApprover != null) {
                nextApprover.approve(amount); // 传递给下一个审批人
            } else {
                System.out.println("金额太大,无法批准");
            }
        }
    }
}

// 具体处理者:经理
public class Manager extends Approver {
    @Override
    public void approve(int amount) {
        if (amount <= 5000) {
            System.out.println("经理批准了 " + amount + " 元的报销");
        } else {
            if (nextApprover != null) {
                nextApprover.approve(amount); // 传递给下一个审批人
            } else {
                System.out.println("金额太大,无法批准");
            }
        }
    }
}

// 具体处理者:总经理
public class CEO extends Approver {
    @Override
    public void approve(int amount) {
        System.out.println("总经理批准了 " + amount + " 元的报销");
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        // 创建审批人
        Director director = new Director();
        Manager manager = new Manager();
        CEO ceo = new CEO();

        // 设置责任链
        director.setNextApprover(manager);
        manager.setNextApprover(ceo);

        // 发起报销请求
        director.approve(500); // 主任批准
        director.approve(2000); // 经理批准
        director.approve(6000); // 总经理批准
    }
}

代码解释

  • Approver 类是抽象处理者,定义了 approve 方法和 setNextApprover 方法。
  • Director 类、Manager 类和 CEO 类是具体处理者,实现了 approve 方法,负责处理特定金额的报销请求。
  • Client 类是客户端,负责创建责任链,并将报销请求发送到链上。

输出结果

主任批准了 500 元的报销
经理批准了 2000 元的报销
总经理批准了 6000 元的报销

四、 责任链模式的优缺点

优点:

  • 解耦请求和处理 🤝!
  • 灵活添加和删除处理器 🤸!
  • 简化代码 💫!
  • 提高代码的可维护性 💡!

缺点:

  • 请求可能无法被处理 😫!
  • 调试困难 🤯!

五、 责任链模式的应用场景

  • 审批流程: 报销审批、请假审批等等 📝!
  • 事件处理: 鼠标点击、键盘输入等等 🖱️⌨️!
  • 过滤器: 敏感词过滤、恶意请求过滤等等 🛡️!
  • 异常处理: 捕获和处理异常 🚨!

六、 总结

  • 责任链模式就像踢皮球,你不行我上! ⚽️
  • 核心概念包括抽象处理者、具体处理者和客户端! 🔑
  • 优点是解耦请求和处理、灵活添加和删除处理器、简化代码、提高代码的可维护性! 👍
  • 缺点是请求可能无法被处理、调试困难! 👎
  • 适用于需要将请求传递给多个处理器,直到有人能够处理它的场景! 🎯

希望这篇文章能让你彻底理解责任链模式! 💯 祝你学习愉快! 😄

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

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

相关文章

20250225-代码笔记03-class CVRPModel AND other class

文章目录 前言一、class CVRPModel(nn.Module):__init__(self, **model_params)函数功能函数代码 二、class CVRPModel(nn.Module):pre_forward(self, reset_state)函数功能函数代码 三、class CVRPModel(nn.Module):forward(self, state)函数功能函数代码 四、def _get_encodi…

面试常问的压力测试问题

性能测试作为软件开发中的关键环节&#xff0c;确保系统在高负载下仍能高效运行。压力测试作为性能测试的重要类型&#xff0c;旨在通过施加超出正常负载的压力&#xff0c;观察系统在极端条件下的表现。面试中&#xff0c;相关问题常被问及&#xff0c;包括定义、重要性、与负…

使用Java构建高效的Web服务架构

使用Java构建高效的Web服务架构 随着互联网技术的飞速发展&#xff0c;Web服务在现代应用中扮演着至关重要的角色。尤其是在企业级应用中&#xff0c;如何构建一个高效、可扩展且易维护的Web服务架构&#xff0c;成为了开发者和架构师面临的一项重要挑战。Java作为一种成熟、稳…

《Python实战进阶》No 10:基于Flask案例的Web 安全性:防止 SQL 注入、XSS 和 CSRF 攻击

第10集&#xff1a;Web 安全性&#xff1a;防止 SQL 注入、XSS 和 CSRF 攻击 在现代 Web 开发中&#xff0c;安全性是至关重要的。无论是用户数据的保护&#xff0c;还是系统稳定性的维护&#xff0c;开发者都需要对常见的 Web 安全威胁有深刻的理解&#xff0c;并采取有效的防…

蓝桥备赛(六)- C/C++输入输出

一、OJ题目输入情况汇总 OJ&#xff08;online judge&#xff09; 接下来会有例题 &#xff0c; 根据一下题目 &#xff0c; 对这些情况进行分析 1.1 单组测试用例 单在 --> 程序运行一次 &#xff0c; 就处理一组 练习一&#xff1a;计算 (ab)/c 的值 B2009 计算 (ab)/c …

企微审批中MySQL字段TEXT类型被截断的排查与修复实践

在MySQL中&#xff0c;TEXT类型字段常用于存储较大的文本数据&#xff0c;但在一些应用场景中&#xff0c;当文本内容较大时&#xff0c;TEXT类型字段可能无法满足需求&#xff0c;导致数据截断或插入失败。为了避免这种问题&#xff0c;了解不同文本类型&#xff08;如TEXT、M…

[ISP] AE 自动曝光

相机通过不同曝光参数&#xff08;档位快门时间 x 感光度 x 光圈大小&#xff09;控制进光量来完成恰当的曝光。 自动曝光流程大概分为三部分&#xff1a; 1. 测光&#xff1a;点测光、中心测光、全局测光等&#xff1b;通过调整曝光档位使sensor曝光在合理的阈值内&#xff0…

小程序画带圆角的圆形进度条

老的API <canvas id"{{canvasId}}" canvas-id"{{canvasId}}" style"opacity: 0;" class"canvas"/> startDraw() {const { canvasId } this.dataconst query this.createSelectorQuery()query.select(#${canvasId}).bounding…

16. LangChain实战项目2——易速鲜花内部问答系统

需求简介 易束鲜花企业内部知识库如下&#xff1a; 本实战项目设计一个内部问答系统&#xff0c;基于这些内部知识&#xff0c;回答内部员工的提问。 在前面课程的基础上&#xff0c;需要安装的依赖包如下&#xff1a; pip install docx2txt pip install qdrant-client pip i…

FPGA开发,使用Deepseek V3还是R1(8):FPGA的全流程(简略版)

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…

微服务学习(1):RabbitMQ的安装与简单应用

目录 RabbitMQ是什么 为什么要使用RabbitMQ RabbitMQ的安装 RabbitMQ架构及其对应概念 队列的主要作用 交换机的主要作用 RabbitMQ的应用 通过控制面板操作&#xff08;实现收发消息&#xff09; RabbitMQ是什么 RabbitMQ是一个开源的消息队列软件&#xff08;消息代理…

Starrocks入门(二)

1、背景&#xff1a;考虑到Starrocks入门这篇文章&#xff0c;安装的是3.0.1版本的SR&#xff0c;参考&#xff1a;Starrocks入门-CSDN博客 但是官网的文档&#xff0c;没有对应3.0.x版本的资料&#xff0c;却有3.2或者3.3或者3.4或者3.1或者2.5版本的资料&#xff0c;不要用较…

【北京迅为】itop-3568 开发板openharmony鸿蒙烧写及测试-第1章 体验OpenHarmony—烧写镜像

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

Electron一小时快速上手

1. 什么是 Electron? Electron 是一个跨平台桌面应用开发框架&#xff0c;开发者可以使用 HTML、CSS、JavaScript 等 Web 技术来构建桌面应用程序。它的本质是结合了 Chromium 和 Node.js&#xff0c;现在广泛用于桌面应用程序开发。例如&#xff0c;以下桌面应用都使用了 El…

算法004——盛最多水的容器

力扣——盛最多水的容器点击即可跳转 当我们选择1号线和8号线时&#xff0c;下标为 1 和 8 形成容器的容积的高度是由 较矮的决定的&#xff0c;即下标为 8 的位置&#xff1b; 而宽度则是 1到8 之间的距离&#xff0c;为 8-17&#xff0c;此时容器的容积为 7 * 7 49。 当我…

Java Web-Filter

Filter 在 Java Web 开发中&#xff0c;Filter&#xff08;过滤器&#xff09;是 Servlet 规范中的一个重要组件&#xff0c;它可以对客户端与服务器之间的请求和响应进行预处理和后处理。以下从多个方面详细介绍 Java Web 中的 Filter&#xff1a; 一、概念和作用 概念&…

DeepSeek-R1训练时采用的GRPO算法数学原理及算法过程浅析

先来简单看下PPO和GRPO的区别&#xff1a; PPO&#xff1a;通过奖励和一个“评判者”模型&#xff08;critic 模型&#xff09;评估每个行为的“好坏”&#xff08;价值&#xff09;&#xff0c;然后小步调整策略&#xff0c;确保改进稳定。 GRPO&#xff1a;通过让模型自己生…

七星棋牌 6 端 200 子游戏全开源修复版源码(乐豆 + 防沉迷 + 比赛场 + 控制)

七星棋牌源码 是一款运营级的棋牌产品&#xff0c;覆盖 湖南、湖北、山西、江苏、贵州 等 6 大省区&#xff0c;支持 安卓、iOS 双端&#xff0c;并且 全开源。这个版本是 修复优化后的二开版本&#xff0c;新增了 乐豆系统、比赛场模式、防沉迷机制、AI 智能控制 等功能&#…

CSDN博客导出设置介绍

在CSDN编辑博客时&#xff0c;如果想导出保存到本地&#xff0c;可以选择导出为Markdown或者HTML格式。其中导出为HTML时有这几种选项&#xff1a;jekyll site&#xff0c;plain html&#xff0c;plain text&#xff0c;styled html&#xff0c;styled html with toc。分别是什…

音视频-WAV格式

1. WAV格式说明&#xff1a; 2. 格式说明&#xff1a; chunkId&#xff1a;通常是 “RIFF” 四个字节&#xff0c;用于标识文件类型。&#xff08;wav文件格式表示&#xff09;chunkSize&#xff1a;表示整个文件除了chunkId和chunkSize这 8 个字节外的其余部分的大小。Forma…