设计模式——责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它将请求的发送者和接收者解耦,使得多个对象都有机会处理请求,而不是指定特定的接收者。在责任链中,每个对象都是一个处理者,对请求进行判断或处理,并且可以将请求传递给链中的下一个处理者。

原理

  • 抽象处理者(Handler): 定义了一个处理请求的接口,包含了一个方法来处理请求以及一个指向下一个处理者的引用。
  • 具体处理者(Concrete Handler): 是抽象处理者的子类,实现请求处理的方法。如果能够处理该请求,则对其进行处理;否则,通过调用下一个处理者的方法将请求传递下去。
  • 客户端(Client): 创建责任链并提交请求到链上的第一个处理者。

Java代码示例

// 抽象处理者
public abstract class Handler {protected Handler nextHandler;public void setNext(Handler handler) {this.nextHandler = handler;}// 处理请求的方法public abstract void handleRequest(int request);
}// 具体处理者A
public class ConcreteHandlerA extends Handler {@Overridepublic void handleRequest(int request) {if (request < 10) {System.out.println("ConcreteHandlerA handled the request: " + request);} else if (nextHandler != null) {nextHandler.handleRequest(request);} else {System.out.println("Request not handled");}}
}// 具体处理者B
public class ConcreteHandlerB extends Handler {@Overridepublic void handleRequest(int request) {if (request >= 10 && request < 20) {System.out.println("ConcreteHandlerB handled the request: " + request);} else if (nextHandler != null) {nextHandler.handleRequest(request);} else {System.out.println("Request not handled");}}
}// 客户端使用示例
public class Client {public static void main(String[] args) {Handler handlerA = new ConcreteHandlerA();Handler handlerB = new ConcreteHandlerB();// 构建责任链handlerA.setNext(handlerB);// 提交请求handlerA.handleRequest(5);  // ConcreteHandlerA handles it.handlerA.handleRequest(15); // ConcreteHandlerB handles it.handlerA.handleRequest(25); // No one handles it.}
}

想象你正在为一家公司构建一个请假申请审批系统。部门经理、人事主管和CEO都可以审批员工的请假申请。当员工提交申请时,它首先到达部门经理处,如果经理有权批准这个天数的假期则直接处理,否则把申请转交给人事主管,以此类推。在这个例子中,部门经理、人事主管和CEO就形成了一个“责任链”,每个环节都是一个处理者,他们按照一定的顺序处理请求,直到找到合适的审批者为止。

应用

  • 权限系统:不同级别的用户具有不同的权限,请求经过多个角色检查,直到找到有权处理的角色为止。
  • 日志记录器:按级别过滤日志,低级别的处理器不能处理的消息会自动传递给高级别的处理器。
  • 企业审批流程:每一级审批人是一个处理者,根据规则逐级审批或者转交下一级审批。

适用性

  • 请求处理者顺序不确定或动态可变的情况。
  • 一个请求可能由多个对象中的任意一个对象处理,并且希望简化客户端代码,使其不必明确指定处理请求的对象。
  • 需要避免请求发送者与接收者之间的紧耦合,使得系统易于扩展。

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

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

相关文章

KNN算法原理及应用

理解KNN 算法原理 KNN是监督学习分类算法&#xff0c;主要解决现实生活中分类问题。 根据目标的不同将监督学习任务分为了分类学习及回归预测问题。 监督学习任务的基本流程和架构&#xff1a; &#xff08;1&#xff09;首先准备数据&#xff0c;可以是视频、音频、文本、…

【docker】之基础篇一

目录 一、docker的简单介绍二、centos7安装docker设置ustc的镜像镜像相关的命令&#xff1a;容器相关的命令创建镜像的三种方式存出和载入镜像创建与启动容器目录挂载导入和导出容器 三、redhat安装docker四、搭建本地私有仓库五、软件部署1.mysql部署2.nginx部署3.tomcat部署 …

【C++】STL 算法 - 累加填充算法 ( 元素累加算法 - accumulate 函数 | 元素填充算法 - fill 函数 )

文章目录 一、元素累加算法 - accumulate 函数1、函数原型分析2、代码示例 二、元素填充算法 - fill 函数1、函数原型分析2、代码示例 一、元素累加算法 - accumulate 函数 1、函数原型分析 在 C 语言 的 标准模板库 ( STL , STL Standard Template Library ) 中 , 提供了 accu…

晶格动力学 GULP 软件的安装步骤

---------------------------------------------------------------------- GULP软件现已发展到5.2版本&#xff0c;其使用Fortran编译器&#xff0c;可运行在Linux/Unix系统下&#xff0c;但不提供任何Windows版本的技术支持。 下载网址&#xff1a; http://gulp.curtin.ed…

flink 最后一个窗口一直没有新数据,窗口不关闭问题

flink 最后一个窗口一直没有新数据&#xff0c;窗口不关闭问题 自定义实现 WatermarkStrategy接口 自定义实现 WatermarkStrategy接口 窗口类型&#xff1a;滚动窗口 代码&#xff1a; public static class WatermarkDemoFunction implements WatermarkStrategy<JSONObject…

C#设计模式教程(3):抽象工厂模式

抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建一系列相关或相互依赖对象的家族,而无需指定它们具体的类。这种模式是工厂方法模式的一种扩展,它用于创建的不是一个产品,而是多个产品的家族。 C# 代码实现 以下是C#中实现抽象工厂模式的一个简单示例: 首…

10种较流行的网络安全框架及特点分析

网络安全框架主要包括安全控制框架&#xff08;SCF&#xff09;、安全管理框架&#xff08;SMP&#xff09;和安全治理框架&#xff08;SGF&#xff09;等类型。对于那些希望按照行业最佳实践来开展网络安全能力建设的企业来说&#xff0c;理解并实施强大的网络安全框架至关重要…

Demystifying CXL Memory with Genuine CXL-Ready Systems and Devices——论文阅读

MICRO 2023 Paper CXL论文阅读汇总 问题 对更大容量和更高带宽的内存的不断增长的需求推动了基于Compute eXpress Link&#xff08;CXL&#xff09;的内存扩展和分离技术的创新。特别是&#xff0c;基于CXL的内存扩展技术不仅能够经济地扩展内存容量和带宽&#xff0c;还能够…

第3章 语句与函数

插入汇编语句 asm语句可在C或C程序中插入汇编代码。 VS2019编译器使用“_asm”插入汇编代码。 static_assert用于提供静态断言服务&#xff0c;即在编译时判定执行条件是否满足。 使用格式为 static_assert(条件表达式, ”输出信息“)。 不满足则编译报错。 C函数 函数说明不定…

【数据结构】二叉树(遍历,递归)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​ 目录 二叉树遍历规则 前序遍历 ​…

flutter 客户端日志上传定位错误信息

背景 flutter 开发的app 安装到真机上 无法定位报错信息&#xff0c;只能使用usb连接电脑 使用adb logcat来查看日志效率低下。 想法 如果将flutter 开发的app 运行的时候 将日志写进一个日志文件里面去&#xff0c;然后给flutter app搭建一个http服务器&#xff0c;后端知道对…

前端环境安装【mac/window,nvm,node,npm,yarn,react】

目录 nvm&#xff1a;node版本管理器 安装 window mac 常见命令 Node、npm yarn React a.全局方式 b.临时方式 运行 nvm&#xff1a;node版本管理器 nvm 主要是用来管理 nodejs 和 npm 版本的工具&#xff0c;可以用来切换不同版本的 nodejs。安装nvm之前先卸载nod…

如何使用VNC实现Win系统远程桌面Ubuntu图形化界面【内网穿透】

文章目录 推荐前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 …

vue:处理base64格式文件pdf、图片预览

一、需求&#xff1a;后端返回是base64数据&#xff0c;需要前端处理来展示文件。 二、实现方法&#xff1a; 解释一下这段代码的功能&#xff1a; &#xff09;preview(item) 是一个函数&#xff0c;接受一个参数 item&#xff0c;其中包含了文件的相关信息。 &#xff09;首…

HTML5+CSS3+JS小实例:实时给中文添加拼音

实例:实时给中文添加拼音 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"&…

使用freessl为网站获取https证书及配置详细步骤

文章目录 一、进入freessl网站二、修改域名解析记录三、创建证书四、配置证书五、服务启动 一、进入freessl网站 首先进入freessl网站&#xff0c;需要注册一个账号 freessl网站 进入网站后填写自己的域名 接下来要求进行DCV配置 二、修改域名解析记录 到域名管理处编辑域名…

项目开发中安全问题以及解决办法——客户传进来的数据不可信

用户传进来的数据是不可信的&#xff0c;比如下面这种情况下&#xff1a; PostMapping("/order") public void wrong(RequestBody Order order) { this.createOrder(order); } Data public class Order { private long itemId; //商品ID private BigDecimal ite…

智慧水务管理的发展历史有哪些阶段呢

随着科技的飞速发展&#xff0c;智慧水务管理已经成为了城市基础设施的重要组成部分。从传统的人工管理到现代的智能化管理&#xff0c;智慧水务经历了多个阶段的发展历程。本文将带您了解智慧水务管理的历史演变。 一、初级阶段&#xff1a;人工管理 在智慧水务管理发展的初期…

MS2358——96KHz、24bit 音频 ADC

产品简述 MS2358 是带有采样速率 8kHz-96kHz 的立体声音频模数 转换器&#xff0c;适合于面向消费者的专业音频系统。 MS2358 通过使用增强型双位 Δ - ∑ 技术来实现其高精度 的特点。 MS2358 支持单端的模拟输入&#xff0c;所以不需要外部器 件&#xff0c;非常适…

maven环境搭建(打包项目)

Maven:直观来讲就是打包写好的代码封装 Apahche 软件基金会&#xff08;非营业的组织&#xff0c;把一些开源软件维护管理起来&#xff09; maven apahce的一个开宇拿项目&#xff0c;是一个优秀的项目构建&#xff08;管理工具&#xff09; maven 管理项目的jar 以及jar与j…