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

目录
- 一、 啥是责任链模式?
- 二、 为什么要用责任链模式?
- 三、 责任链模式的实现方式
- 四、 责任链模式的优缺点
- 五、 责任链模式的应用场景
- 六、 总结
🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解命令模式请看: (十 五)趣学设计模式 之 命令模式!
✨更多请看个人主页: 码熔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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 元的报销
四、 责任链模式的优缺点
优点:
- 解耦请求和处理 🤝!
- 灵活添加和删除处理器 🤸!
- 简化代码 💫!
- 提高代码的可维护性 💡!
缺点:
- 请求可能无法被处理 😫!
- 调试困难 🤯!
五、 责任链模式的应用场景
- 审批流程: 报销审批、请假审批等等 📝!
- 事件处理: 鼠标点击、键盘输入等等 🖱️⌨️!
- 过滤器: 敏感词过滤、恶意请求过滤等等 🛡️!
- 异常处理: 捕获和处理异常 🚨!
六、 总结
- 责任链模式就像踢皮球,你不行我上! ⚽️
- 核心概念包括抽象处理者、具体处理者和客户端! 🔑
- 优点是解耦请求和处理、灵活添加和删除处理器、简化代码、提高代码的可维护性! 👍
- 缺点是请求可能无法被处理、调试困难! 👎
- 适用于需要将请求传递给多个处理器,直到有人能够处理它的场景! 🎯
希望这篇文章能让你彻底理解责任链模式! 💯 祝你学习愉快! 😄
相关文章:
(十 六)趣学设计模式 之 责任链模式!
目录 一、 啥是责任链模式?二、 为什么要用责任链模式?三、 责任链模式的实现方式四、 责任链模式的优缺点五、 责任链模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,…...
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…...
面试常问的压力测试问题
性能测试作为软件开发中的关键环节,确保系统在高负载下仍能高效运行。压力测试作为性能测试的重要类型,旨在通过施加超出正常负载的压力,观察系统在极端条件下的表现。面试中,相关问题常被问及,包括定义、重要性、与负…...
Python——365天学习规划
文章目录 1. 第一阶段:Python基础(Day 1-60) 1.1 Week 1-2:基础语法 1.1.1 Day 1-3:变量、数据类型、运算符、输入输出 1.1.2 Day 4-7:条件语句(if-elif-else) 1.1.3 Day 8-14&…...
河南理工XCPC萌新选拔赛
A 树之荣荣 青梅熙熙 树之荣荣 青梅熙熙 这个题是一个经典的博弈问题。我们可以考虑一种情况,就是你每一次都会取一个。那么最后一个你肯定不能取。所以我们可以考虑减去一个后的值。判断它的和是奇数还是偶数即可。 int n; cin >> n;int s 0;for (int i 1;…...
设计模式|策略模式 Strategy Pattern 详解
目录 一、策略模式概述二、策略模式的实现2.1 策略接口2.2 具体策略类2.3 上下文类2.4 客户端代码2.5 UML类图2.6 UML时序图 三、优缺点3.1 ✅优点3.2 ❌ 缺点 四、最佳实践场景4.1 适合场景描述4.2 具体场景 五、扩展5.1 继承复用机制和复合策略5.2 对象管理:优化策…...
Wireshark 插件开发实战指南
Wireshark 插件开发实战指南 环境搭建流程图 #mermaid-svg-XpNibno7BIyfzNn5 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-XpNibno7BIyfzNn5 .error-icon{fill:#552222;}#mermaid-svg-XpNibno7BIyfzNn5 .error-t…...
使用Java构建高效的Web服务架构
使用Java构建高效的Web服务架构 随着互联网技术的飞速发展,Web服务在现代应用中扮演着至关重要的角色。尤其是在企业级应用中,如何构建一个高效、可扩展且易维护的Web服务架构,成为了开发者和架构师面临的一项重要挑战。Java作为一种成熟、稳…...
《Python实战进阶》No 10:基于Flask案例的Web 安全性:防止 SQL 注入、XSS 和 CSRF 攻击
第10集:Web 安全性:防止 SQL 注入、XSS 和 CSRF 攻击 在现代 Web 开发中,安全性是至关重要的。无论是用户数据的保护,还是系统稳定性的维护,开发者都需要对常见的 Web 安全威胁有深刻的理解,并采取有效的防…...
蓝桥备赛(六)- C/C++输入输出
一、OJ题目输入情况汇总 OJ(online judge) 接下来会有例题 , 根据一下题目 , 对这些情况进行分析 1.1 单组测试用例 单在 --> 程序运行一次 , 就处理一组 练习一:计算 (ab)/c 的值 B2009 计算 (ab)/c …...
企微审批中MySQL字段TEXT类型被截断的排查与修复实践
在MySQL中,TEXT类型字段常用于存储较大的文本数据,但在一些应用场景中,当文本内容较大时,TEXT类型字段可能无法满足需求,导致数据截断或插入失败。为了避免这种问题,了解不同文本类型(如TEXT、M…...
[ISP] AE 自动曝光
相机通过不同曝光参数(档位快门时间 x 感光度 x 光圈大小)控制进光量来完成恰当的曝光。 自动曝光流程大概分为三部分: 1. 测光:点测光、中心测光、全局测光等;通过调整曝光档位使sensor曝光在合理的阈值内࿰…...
小程序画带圆角的圆形进度条
老的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——易速鲜花内部问答系统
需求简介 易束鲜花企业内部知识库如下: 本实战项目设计一个内部问答系统,基于这些内部知识,回答内部员工的提问。 在前面课程的基础上,需要安装的依赖包如下: pip install docx2txt pip install qdrant-client pip i…...
代码的解读——自用
代码来自:https://github.com/ChuHan89/WSSS-Tissue?tabreadme-ov-file 借助了一些人工智能 run_pipeline.sh 功能总结 该脚本用于执行一个 弱监督语义分割(WSSS) 的完整流程,包含三个阶段: Stage1:训…...
蓝桥杯试题:DFS回溯
一、题目要求 输入一个数组n,输出1到n的全排列 二、代码展示 import java.util.*;public class ikun {static List<List<Integer>> list new ArrayList<>();public static void main(String[] args) { Scanner sc new Scanner(System.in);…...
FPGA开发,使用Deepseek V3还是R1(8):FPGA的全流程(简略版)
以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…...
一个py文件搞定mysql查询+Json转换+表数据提取+根据数据条件生成excel文件+打包运行一条龙
import os import argparse import pymssql import json import pandas as pd from datetime import datetime from pandas.io.formats.excel import ExcelFormatter import openpyxl# 投注类型映射字典 BET_MAPPING {1: WIN, 2: PLA, 3: QIN, 4: QPL,5: DBL, 6: TCE, 7: QTT,…...
微服务学习(1):RabbitMQ的安装与简单应用
目录 RabbitMQ是什么 为什么要使用RabbitMQ RabbitMQ的安装 RabbitMQ架构及其对应概念 队列的主要作用 交换机的主要作用 RabbitMQ的应用 通过控制面板操作(实现收发消息) RabbitMQ是什么 RabbitMQ是一个开源的消息队列软件(消息代理…...
【RAG】Embeding 和 Rerank学习笔记
Q: 现在主流Embeding模型架构 在RAG(Retrieval-Augmented Generation)系统中,嵌入模型(Embedding Model) 是检索阶段的核心组件,负责将查询(Query)和文档(Document&#…...
【Delphi】如何解决使用webView2时主界面置顶,而导致网页选择文件对话框被覆盖问题
一、问题描述: 在Delphi 中使用WebView2控件,如果预先把主界面置顶(Self.FormStyle : fsStayOnTop;),此时,如果在Web页面中有使用(<input type"file" id"fileInput" acc…...
【量化金融自学笔记】--开篇.基本术语及学习路径建议
在当今这个信息爆炸的时代,金融领域正经历着一场前所未有的变革。传统的金融分析方法逐渐被更加科学、精准的量化技术所取代。量化金融,这个曾经高不可攀的领域,如今正逐渐走进大众的视野。它将数学、统计学、计算机科学与金融学深度融合&…...
iOS 使用消息转发机制实现多代理功能
在iOS开发中,我们有时候会用到多代理功能,比如我们列表的埋点事件,需要我们在列表的某个特定的时机进行埋点上报,我们当然可以用最常见的做法,就是设置代理实现代理方法,然后在对应的代理方法里面进行上报&…...
16.3 LangChain Runnable 协议精要:构建高效大模型应用的核心基石
LangChain Runnable 协议精要:构建高效大模型应用的核心基石 关键词:LCEL Runnable 协议、LangChain 链式开发、自定义组件集成、流式处理优化、生产级应用设计 1. Runnable 协议设计哲学与核心接口 1.1 协议定义与类结构 #mermaid-svg-PlmvpSDrEUrUGv2p {font-family:&quo…...
Starrocks入门(二)
1、背景:考虑到Starrocks入门这篇文章,安装的是3.0.1版本的SR,参考:Starrocks入门-CSDN博客 但是官网的文档,没有对应3.0.x版本的资料,却有3.2或者3.3或者3.4或者3.1或者2.5版本的资料,不要用较…...
【北京迅为】itop-3568 开发板openharmony鸿蒙烧写及测试-第1章 体验OpenHarmony—烧写镜像
瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…...
Electron一小时快速上手
1. 什么是 Electron? Electron 是一个跨平台桌面应用开发框架,开发者可以使用 HTML、CSS、JavaScript 等 Web 技术来构建桌面应用程序。它的本质是结合了 Chromium 和 Node.js,现在广泛用于桌面应用程序开发。例如,以下桌面应用都使用了 El…...
算法004——盛最多水的容器
力扣——盛最多水的容器点击即可跳转 当我们选择1号线和8号线时,下标为 1 和 8 形成容器的容积的高度是由 较矮的决定的,即下标为 8 的位置; 而宽度则是 1到8 之间的距离,为 8-17,此时容器的容积为 7 * 7 49。 当我…...
Java Web-Filter
Filter 在 Java Web 开发中,Filter(过滤器)是 Servlet 规范中的一个重要组件,它可以对客户端与服务器之间的请求和响应进行预处理和后处理。以下从多个方面详细介绍 Java Web 中的 Filter: 一、概念和作用 概念&…...
LeetCode 热题100 438. 找到字符串中所有字母异位词
LeetCode 热题100 | 438. 找到字符串中所有字母异位词 大家好,今天我们来解决一道经典的算法题——找到字符串中所有字母异位词。这道题在 LeetCode 上被标记为中等难度,要求我们在字符串 s 中找到所有是 p 的异位词的子串,并返回这些子串的…...
