java设计模式(十六)职责链模式(Chain of Responsibility Pattern)

1、模式介绍:

职责链模式是一种行为设计模式,其中多个对象按顺序处理请求,直到其中一个对象能够处理请求为止。请求沿着链传递,直到有一个对象处理它为止。

2、应用场景:

职责链模式适用于以下场景:
请求的发送者不需要知道请求的处理细节,以及请求的处理者是谁。
多个对象可以处理同一个请求,但具体处理者在运行时确定。
系统需要动态地指定可以处理请求的对象集合

具体的应用场景包括:
权限验证:例如,一个网页访问请求可以经过多个权限验证器,任何一个验证器通过即可访问。
日志记录:日志记录器可以形成一个职责链,每个记录器记录不同级别的日志。
请求的分发:例如,一个请求可以经过多个过滤器或处理器,每个处理器负责不同的处理逻辑。

3、优点:

降低耦合度:请求的发送者和接收者解耦,可以灵活地添加或删除处理器。
增强了灵活性:可以动态地改变链的组成和处理顺序。
简化了对象:每个处理器只关注自己的任务,不需要了解整个处理流程。

4、缺点:

请求可能未被处理:如果链未正确配置,请求可能无法被处理。
性能问题:长链可能会影响性能,因为每个请求都可能沿着链传递到链的末端。

5、代码示例:

/*** 请求类** @author FM_南风* @date 2024/7/5*/
public class Request {private int level;public Request(int level) {this.level = level;}public int getLevel() {return level;}
}/*** 抽象处理器类** @author FM_南风* @date 2024/7/5*/
abstract class Handler {protected Handler successor;public void setSuccessor(Handler successor) {this.successor = successor;}public abstract void handleRequest(Request request);
}/*** 具体处理器类 - 级别1处理器** @author FM_南风* @date 2024/7/5*/
public class ConcreteHandler1 extends Handler{public void handleRequest(Request request) {if (request.getLevel() <= 1) {System.out.println("ConcreteHandler1 处理请求");} else if (successor != null) {successor.handleRequest(request);}}
}/*** 具体处理器类 - 级别2处理器** @author FM_南风* @date 2024/7/5*/
public class ConcreteHandler2 extends Handler {public void handleRequest(Request request) {if (request.getLevel() <= 2) {System.out.println("ConcreteHandler2 处理请求");} else if (successor != null) {successor.handleRequest(request);}}
}/*** 具体处理器类 - 级别3处理器** @author FM_南风* @date 2024/7/5*/
public class ConcreteHandler3 extends Handler{public void handleRequest(Request request) {if (request.getLevel() <= 3) {System.out.println("ConcreteHandler3 处理请求");} else {System.out.println("所有处理器均不能处理该请求");}}
}/*** 应用** @author FM_南风* @date 2024/7/5*/
public class ChainClient {public static void main(String[] args) {// 创建处理器对象Handler handler1 = new ConcreteHandler1();Handler handler2 = new ConcreteHandler2();Handler handler3 = new ConcreteHandler3();// 设置处理链handler1.setSuccessor(handler2);handler2.setSuccessor(handler3);// 创建不同级别的请求Request request1 = new Request(2);Request request2 = new Request(5);// 处理请求handler1.handleRequest(request1); // 输出 ConcreteHandler2 处理请求handler1.handleRequest(request2); // 输出 所有处理器均不能处理该请求}
}

6、结果展示:

7、示例说明:

在这个例子中:

Request 类表示请求,具有一个级别属性。
Handler 是抽象处理器类,定义了处理请求的方法和持有下一个处理器的引用。
ConcreteHandler1ConcreteHandler2 和 ConcreteHandler3 是具体的处理器类,每个处理器根据自己的能力处理请求或传递到下一个处理器。
ChainOfResponsibilityPatternExample 是测试类,创建了一个简单的处理链,并测试不同级别的请求。

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

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

相关文章

初学51单片机之UART串口通信

CSDN其他博主的博文&#xff08;自用&#xff09;嵌入式学习笔记9-51单片机UART串口通信_51uart串口通讯-CSDN博客 CSDN其他博主的博文写的蛮好&#xff0c;如果你想了解51单片机UART串口可以点进去看看&#xff1a; UART全称Universal Asynchronous Receiver/Transmitter即通…

常用知识碎片 分页组件的使用(arco-design组件库)

目录 分页组件使用 API 组件代码示例 使用思路&#xff1a; 前端示例代码 html script 后端示例代码 Controller Impl xml 总结 分页组件使用 使用Arco Design之前需要配置好搭建前端环境可以看我另外一篇文章&#xff1a; 手把手教你 创建Vue项目并引入Arco Desi…

生存人数00

题目链接 生存人数 题目描述 注意点 假设所有人都出生于 1900 年至 2000 年&#xff08;含 1900 和 2000 &#xff09;之间birth[i] < death[i]如果有多个年份生存人数相同且均为最大值&#xff0c;输出其中最小的年份 解答思路 初始想到的是遍历birth&#xff0c;更新…

正则表达式语法

普通字符&#xff1a; 匹配 "a" 将匹配文本中的 "a" 字符: 示例: a 匹配 "a" 元字符&#xff1a; \d 匹配 任意数字字符 等价于 [0-9] : 示例: \d 匹配 "1" \D 匹配一个非数字字符 等价于 [^0-9] \w 匹配 任意字母数字字符: 示例:…

B2B领域的客户裂变策略:打造行业内的共赢生态

在日益竞争激烈的B2B市场中&#xff0c;客户裂变作为一种高效的增长策略&#xff0c;不仅能够帮助企业快速扩大客户基础&#xff0c;还能促进行业内资源共享与合作&#xff0c;共同构建一个健康、可持续的共赢生态。本文将探讨B2B领域实施客户裂变策略的关键要素&#xff0c;以…

极狐GitLab 17.0 重磅发布,100+ DevSecOps功能更新来啦~【十】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

无障碍全免费上手智能体:Autogen Studio结合Deepseek Coder打造一款AI旅游规划师

本文的唯一目的是通过打造一款AI旅游规划师&#xff0c;通俗易懂、深入浅出的讲清楚AI应用的大方向-智能体-的原理。 无需科学上网&#xff0c;无需付费API&#xff0c;无需编程能力&#xff0c;一小时即可部署、搭建一款复杂的、多代理交互的AI智能体-旅游规划师&#xff0c;…

【深度学习】PyTorch深度学习笔记02-线性模型

1. 监督学习 2. 数据集的划分 3. 平均平方误差MSE 4. 线性模型Linear Model - y x * w 用穷举法确定线性模型的参数 import numpy as np import matplotlib.pyplot as pltx_data [1.0, 2.0, 3.0] y_data [2.0, 4.0, 6.0]def forward(x):return x * wdef loss(x, y):y_pred…

关于云服务器映像和快照的一些介绍

在云计算环境中&#xff0c;服务器映像是指一个虚拟机实例的静态快照。这种映像不仅包括操作系统、应用程序和配置&#xff0c;还包括存储的状态和数据。主要作用包括&#xff1a; 快速部署新实例&#xff1a; 可以基于现有的服务器映像快速创建新的虚拟机实例&#xff0c;节省…

java入门1.5.0

前言&#xff1a; 在java入门1.4.0中&#xff0c;我们快速构建了一个基于Maven管理的Spring boot3项目&#xff0c;对基本文件结构有了初步的认知&#xff0c;创建了git仓库 正片: 看山是山&#xff0c;看山不是山&#xff0c;看山还是山&#xff0c;下面两段代码很好了验证这…

vue3项目中浏览器打开本地文档或者下载本地应用的方法(2024-07-11)

在public文件夹下面加入预览的文件【操作说明文档】。 此文件夹不会压缩并且路径不变&#xff0c;所以是最佳的存放文件的位置。 代码&#xff1a; <template><n-icon title"操作文档" style"cursor: pointer;margin-right: 10px;" size"2…

MATLAB中使用HDL Coder生成HDL代码时的报错整理

Delay balancing unsuccessful because an extra 4 cycles of latency introduced by optimizations in the feedback loop cannot be offset using design delays for the loop latency budget. 产生原因 由于时序考虑&#xff0c;在每个模块的输出端添加了1到2级的输入输出流…

力扣题解( 最长递增子序列)

300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子…

深圳比创达|EMC与EMI测试整改:打造电磁“绿色”产品的必经之路4

深圳比创达&#xff5c;EMC与EMI测试整改&#xff1a;打造电磁“绿色”产品的必经之路 随着电子技术的飞速发展&#xff0c;电子设备在日常生活和工业生产中的应用越来越广泛。然而&#xff0c;这些设备在运行时产生的电磁辐射&#xff08;EMI&#xff09;和对外界电磁干扰的敏…

java基础复习

初识 JDK&#xff08;开发包&#xff09; JRK&#xff08;运行环境&#xff09; 解释型语言 数据类型&#xff1a; 基本数据类型&#xff1a;byte short int(默认) long float double(默认) char boolean 引用数据类型&#xff1a;类 接口 数组 扩展&#xff1a; BigDecimal…

关于解决各类由于电脑名为中文导致的各类问题

解决方法&#xff1a;Anoconda安装笔记win10 更改中文用户名为英文_anaconda prompt运行索引含汉字,怎么改成英文-CSDN博客

从人工巡检到智能预警:视频AI智能监控技术在水库/河湖/水利防汛抗洪中的应用

一、背景需求分析 近日&#xff0c;我国多省市遭遇连日暴雨&#xff0c;导致水库、湖泊、河道等水域水位暴涨&#xff0c;城市内涝频发。随着夏季汛期的到来&#xff0c;降雨天气频繁&#xff0c;水利安全管理面临严峻挑战。为保障水库安全、预防和减少洪涝灾害&#xff0c;采…

MVC分页

public ActionResult Index(int ? page){IPagedList<EF.ACCOUNT> userPagedList;using (EF.eMISENT content new EF.eMISENT()){第几页int pageNumber page ?? 1;每页数据条数&#xff0c;这个可以放在配置文件中int pageSize 10;//var infoslist.C660List.OrderBy(…

【C语言】字符常量详解

目录 C语言字符常量 (Character Constants)1. 概念与定义1.1 字符常量的表示1.2 字符常量的存储 2. 特殊字符常量2.1 常见的特殊字符常量2.2 转义序列 3. 字符常量的使用3.1 条件判断输出结果&#xff1a; 3.2 字符运算输出结果&#xff1a; 3.3 数组与字符串处理输出结果&…

7.11 cf div3 A

Problem - A - Codeforces 题目概述 求最少问题数量&#xff0c;以确保能举办m轮比赛&#xff0c;每轮包含一个难度级别为 ‘A’ 到 ‘G’ 的问题。 ac代码 #include<bits/stdc.h> typedef long long ll;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) …