(十 六)趣学设计模式 之 责任链模式!
目录
- 一、 啥是责任链模式?
- 二、 为什么要用责任链模式?
- 三、 责任链模式的实现方式
- 四、 责任链模式的优缺点
- 五、 责任链模式的应用场景
- 六、 总结
🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解命令模式请看: (十 五)趣学设计模式 之 命令模式!
✨更多请看个人主页: 码熔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 元的报销
四、 责任链模式的优缺点
优点:
- 解耦请求和处理 🤝!
- 灵活添加和删除处理器 🤸!
- 简化代码 💫!
- 提高代码的可维护性 💡!
缺点:
- 请求可能无法被处理 😫!
- 调试困难 🤯!
五、 责任链模式的应用场景
- 审批流程: 报销审批、请假审批等等 📝!
- 事件处理: 鼠标点击、键盘输入等等 🖱️⌨️!
- 过滤器: 敏感词过滤、恶意请求过滤等等 🛡️!
- 异常处理: 捕获和处理异常 🚨!
六、 总结
- 责任链模式就像踢皮球,你不行我上! ⚽️
- 核心概念包括抽象处理者、具体处理者和客户端! 🔑
- 优点是解耦请求和处理、灵活添加和删除处理器、简化代码、提高代码的可维护性! 👍
- 缺点是请求可能无法被处理、调试困难! 👎
- 适用于需要将请求传递给多个处理器,直到有人能够处理它的场景! 🎯
希望这篇文章能让你彻底理解责任链模式! 💯 祝你学习愉快! 😄
相关文章:

(十 六)趣学设计模式 之 责任链模式!
目录 一、 啥是责任链模式?二、 为什么要用责任链模式?三、 责任链模式的实现方式四、 责任链模式的优缺点五、 责任链模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,…...

动态规划/贪心算法
一、动态规划 动态规划 是一种用于解决优化问题的算法设计技术,尤其适用于具有重叠子问题和最优子结构性质的问题。它通过将复杂问题分解为更简单的子问题,并保存这些子问题的解以避免重复计算,从而提高效率。 动态规划的核心思想 最优子结…...

PH热榜 | 2025-03-04
1. MGX 标语:第一支人工智能开发团队 介绍:MGX(MetaGPT X)是一个基于真实软件标准操作程序(SOP)的多代理人工智能平台。在这里,你可以随时与AI团队的领导、产品经理、架构师、工程师和数据分析…...
Mybatis-Plus 插件机制与自定义插件实现
1. Mybatis-Plus 插件系统概述 Mybatis-Plus 提供了一个简单而强大的插件机制,允许开发者在 MyBatis 执行 SQL 的过程中插入自定义逻辑。通过插件机制,用户可以实现对 SQL 执行过程的拦截和修改。Mybatis-Plus 插件基于 MyBatis 的拦截器模式进行实现&a…...

开源表单、投票、测评平台部署教程
填鸭表单联合宝塔面板深度定制,自宝塔面板 9.2 版本开始,在宝塔面板-软件商店中可以一键部署填鸭表单系统。 简单操作即可拥有属于自己的表单问卷系统,快速赋能业务。即使小白用户也能轻松上手。 社区版体验地址:https://demo.tduckapp.com/home 前端项目地址: tduck-fro…...

行为模式---命令模式
概念 命令模式是一种行为设计模式,它的核心思想就是将请求封装为一个对象,此对象包含与请求相关的所有信息。可以用不同的请求对客户进行参数化。命令模式通过将请求的发送者和接收者解耦,支持请求的排队、记录、撤销等操作。 使用场景 1、…...

zabbix配置邮件告警
目录 实现步骤: 实现目的: 1.在监控端操作: 2.web界面部署 实现步骤: 1、在 zabbix服务端配置邮件发送脚本和修改 zabbix服务端配置文件; 2、在 zabbix前端控制台进行相关设置。 实现目的: Zab…...
INI和CSV文件保存
INI文件 INI文件是一种配置文件格式,通常用于Windows操作系统中的应用程序中。 它是一种文本文件,由多个节和键值对组成,用于存储应用程序的配置信息。 INI文件的特点包括: INI文件是一种文本文件,易于编辑和阅读。…...

汽车智能钥匙中PKE低频天线的作用
PKE(Passive Keyless Entry)即被动式无钥匙进入系统,汽车智能钥匙中PKE低频天线在现代汽车的智能功能和安全保障方面发挥着关键作用,以下是其具体作用: 信号交互与身份认证 低频信号接收:当车主靠近车辆时…...

计算机等级考试
一、计算机等级考试——题库 (1)选择题 (2)基本操作题 (3)上网题 (4)文字题 (5)表格题 (6)演示文稿题 二、计算机等级考试——标准评…...

Geotools中获取Shapefile的属性表格字符集编码的一种方法
目录 前言 1、字符集编码的重要性 2、Geotools 在 GIS 开发中的地位 一、GeoTools的字符集知识 1、字符集的作用 2、shapefile中字符集信息 二、GeoTools中获取字符集的方法 1、默认获取 2、从DataStore中获取 3、从CPG文件中获取 4、生产字符获取实践 三、总结 前言…...

HTTP 与 HTTPS 协议:从基础到安全强化
引言 互联网的消息是如何传递的? 是在路由器上不断进行跳转 IP的目的是在寻址 HTTP 协议:互联网的基石 定义 HTTP(英文:HyperText Transfer Protocol,缩写:HTTP),即超文本传输协…...

Scrapy爬虫框架介绍
目录 什么是Scrapy Scrapy核心组件 Scrapy扩展组件 组件交互流程 安装Scrapy Scrapy项目目录结构说明 创建Scrapy项目 创建爬虫 运行爬虫 配置请求头 全局配置请求头 指定爬虫配置请求头 配置管道pipeline 全局配置pipeline 方式一:指定爬虫配置pipe…...
Stable Diffusion模型高清算法模型类详解
Stable Diffusion模型高清算法模型类详细对比表 模型名称核心原理适用场景参数建议显存消耗细节增强度优缺点4x-UltraSharp残差密集块(RDB)结构优化纹理生成真实人像/建筑摄影重绘幅度0.3-0.4,分块尺寸768px★★★★★☆皮肤纹理细腻,但高对比场景易出现…...
软考网络安全口诀
首先,我们来看第一个口诀 “防御为先,安全无小事”。这个口诀强调了网络安全中的防御意识。在软考备考过程中,我们需要深刻理解网络安全不仅仅是技术层面的问题,更是一种全面的防御思维。从网络架构设计到日常运维管理࿰…...

Baklib内容中台赋能企业智管
内容中台构建全场景智管 现代企业数字化运营中,全域内容管理能力已成为核心竞争力。通过智能知识引擎驱动的内容中台架构,企业能够实现跨部门、多形态数据的统一归集与动态调度。以某制造企业为例,其利用中台系统将分散在CRM、ERP及内部文档…...

vscode+vue前端开发环境配置
目录 一、安装Vue二、使用vue新建项目 一、安装Vue 在node.js安装好之后, npm config set registry https://registry.npmmirror.com# 安装vue相关工具,webpack用来项目构建、打包、资源整合等。 npm install webpack -g# 安装vue-cli脚手架 npm insta…...
Python项目-基于深度学习的校园人脸识别考勤系统
引言 随着人工智能技术的快速发展,深度学习在计算机视觉领域的应用日益广泛。人脸识别作为其中的一个重要分支,已经在安防、金融、教育等多个领域展现出巨大的应用价值。本文将详细介绍如何使用Python和深度学习技术构建一个校园人脸识别考勤系统&#…...

浅谈C++函数特性
C的函数特性 前言 在C中,函数加入了许多特性,例如:a、函数缺省参数 b、函数重载 c、内联函数 等等……,这里我会和大家详细去探讨这些特性。以及探讨这些特性的一些细节,同时在内联部分,我们还会把C语言的…...

Python----数据分析(Matplotlib三:绘图二:箱图,散点图,饼图,热力图,3D图)
一、箱图 箱图(Box Plot),又称为箱形图、箱线图、盒式图、盒状图或盒须图,是一种用于展示数据分布情况的统计图表 箱图通过显示数据的中位数、上下四分位数(Q1和Q3)、异常值和数据的分布范围,提…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...