当前位置: 首页 > news >正文

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

在这里插入图片描述

目录

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

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

四、 责任链模式的优缺点

优点:

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

缺点:

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

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

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

六、 总结

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

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

相关文章:

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

目录 一、 啥是责任链模式&#xff1f;二、 为什么要用责任链模式&#xff1f;三、 责任链模式的实现方式四、 责任链模式的优缺点五、 责任链模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;…...

动态规划/贪心算法

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

PH热榜 | 2025-03-04

1. MGX 标语&#xff1a;第一支人工智能开发团队 介绍&#xff1a;MGX&#xff08;MetaGPT X&#xff09;是一个基于真实软件标准操作程序&#xff08;SOP&#xff09;的多代理人工智能平台。在这里&#xff0c;你可以随时与AI团队的领导、产品经理、架构师、工程师和数据分析…...

Mybatis-Plus 插件机制与自定义插件实现

1. Mybatis-Plus 插件系统概述 Mybatis-Plus 提供了一个简单而强大的插件机制&#xff0c;允许开发者在 MyBatis 执行 SQL 的过程中插入自定义逻辑。通过插件机制&#xff0c;用户可以实现对 SQL 执行过程的拦截和修改。Mybatis-Plus 插件基于 MyBatis 的拦截器模式进行实现&a…...

开源表单、投票、测评平台部署教程

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

行为模式---命令模式

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

zabbix配置邮件告警

目录 实现步骤&#xff1a; 实现目的&#xff1a; 1.在监控端操作&#xff1a; 2.web界面部署 ​​​​​​​实现步骤&#xff1a; 1、在 zabbix服务端配置邮件发送脚本和修改 zabbix服务端配置文件; 2、在 zabbix前端控制台进行相关设置。 实现目的&#xff1a; Zab…...

INI和CSV文件保存

INI文件 INI文件是一种配置文件格式&#xff0c;通常用于Windows操作系统中的应用程序中。 它是一种文本文件&#xff0c;由多个节和键值对组成&#xff0c;用于存储应用程序的配置信息。 INI文件的特点包括&#xff1a; INI文件是一种文本文件&#xff0c;易于编辑和阅读。…...

汽车智能钥匙中PKE低频天线的作用

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

计算机等级考试

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

Geotools中获取Shapefile的属性表格字符集编码的一种方法

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

HTTP 与 HTTPS 协议:从基础到安全强化

引言 互联网的消息是如何传递的&#xff1f; 是在路由器上不断进行跳转 IP的目的是在寻址 HTTP 协议&#xff1a;互联网的基石 定义 HTTP&#xff08;英文&#xff1a;HyperText Transfer Protocol&#xff0c;缩写&#xff1a;HTTP&#xff09;&#xff0c;即超文本传输协…...

Scrapy爬虫框架介绍

目录 什么是Scrapy Scrapy核心组件 Scrapy扩展组件 组件交互流程 安装Scrapy Scrapy项目目录结构说明 创建Scrapy项目 创建爬虫 运行爬虫 配置请求头 全局配置请求头 指定爬虫配置请求头 配置管道pipeline 全局配置pipeline 方式一&#xff1a;指定爬虫配置pipe…...

Stable Diffusion模型高清算法模型类详解

Stable Diffusion模型高清算法模型类详细对比表 模型名称核心原理适用场景参数建议显存消耗细节增强度优缺点4x-UltraSharp残差密集块(RDB)结构优化纹理生成真实人像/建筑摄影重绘幅度0.3-0.4&#xff0c;分块尺寸768px★★★★★☆皮肤纹理细腻&#xff0c;但高对比场景易出现…...

软考网络安全口诀

首先&#xff0c;我们来看第一个口诀 “防御为先&#xff0c;安全无小事”。这个口诀强调了网络安全中的防御意识。在软考备考过程中&#xff0c;我们需要深刻理解网络安全不仅仅是技术层面的问题&#xff0c;更是一种全面的防御思维。从网络架构设计到日常运维管理&#xff0…...

Baklib内容中台赋能企业智管

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

vscode+vue前端开发环境配置

目录 一、安装Vue二、使用vue新建项目 一、安装Vue 在node.js安装好之后&#xff0c; npm config set registry https://registry.npmmirror.com# 安装vue相关工具&#xff0c;webpack用来项目构建、打包、资源整合等。 npm install webpack -g# 安装vue-cli脚手架 npm insta…...

Python项目-基于深度学习的校园人脸识别考勤系统

引言 随着人工智能技术的快速发展&#xff0c;深度学习在计算机视觉领域的应用日益广泛。人脸识别作为其中的一个重要分支&#xff0c;已经在安防、金融、教育等多个领域展现出巨大的应用价值。本文将详细介绍如何使用Python和深度学习技术构建一个校园人脸识别考勤系统&#…...

浅谈C++函数特性

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

Python----数据分析(Matplotlib三:绘图二:箱图,散点图,饼图,热力图,3D图)

一、箱图 箱图&#xff08;Box Plot&#xff09;&#xff0c;又称为箱形图、箱线图、盒式图、盒状图或盒须图&#xff0c;是一种用于展示数据分布情况的统计图表 箱图通过显示数据的中位数、上下四分位数&#xff08;Q1和Q3&#xff09;、异常值和数据的分布范围&#xff0c;提…...

深度学习在微纳光子学中的应用

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

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

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征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

C++使用 new 来创建动态数组

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

基于Java+MySQL实现(GUI)客户管理系统

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

Linux 中如何提取压缩文件 ?

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