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;更新…

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

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

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级的输入输出流…

深圳比创达|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…

从人工巡检到智能预警:视频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(…

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) …

最新 Kubernetes 集群部署 + flannel 网络插件(保姆级教程,最新 K8S 1.28.2 版本)

资源列表 操作系统配置主机名IP所需插件CentOS 7.92C4Gk8s-master192.168.60.143flannel-cni-plugin、flannel、coredns、etcd、kube-apiserver、kube-controller-manager、kube-proxy、 kube-scheduler 、containerd、pause 、crictlCentOS 7.92C4Gk8s-node01192.168.60.144f…

Nodejs 第八十六章(部署pm2)

Node.js如何部署? 如果要部署Nodejs项目&#xff0c;第一点肯定是需要有台服务器&#xff0c;第二点需要一个部署工具这里使用pm2 PM2 PM2 是一个非常流行的 Node.js 进程管理工具&#xff0c;用于在生产环境中运行和监控 Node.js 应用程序。它提供了多种功能&#xff0c;帮…

自建邮局服务器相比云邮箱有哪些优势特性?

自建邮局服务器如何配置&#xff1f;搭建自建邮局服务器的技术&#xff1f; 尽管云邮箱服务提供了便捷和低成本的解决方案&#xff0c;自建邮局服务器依然具有许多独特的优势和特性&#xff0c;吸引了众多企业和组织。AokSend将深入探讨自建邮局服务器相比云邮箱的主要优势。 …

BigMarket-基础层持久化数据库

需求 工程对接数据库 图例 结构说明 app-主要用于启动&#xff0c;没有业务逻辑 domain-业务逻辑&#xff0c;如积分的兑换&#xff0c;抽奖&#xff0c; infrastructure-基础层&#xff0c;技术支持&#xff0c;数据服务数据持久化&#xff1a;MySQL&#xff0c;redis&am…

「51媒体」能否提供一份成功邀约媒体的技巧?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传加速季&#xff0c;100万补贴享不停&#xff0c;一手媒体资源&#xff0c;全国100城线下落地执行。详情请联系胡老师。 成功邀约媒体的技巧涉及多个方面&#xff0c;包括了解媒体…

hyperworks软件许可优化解决方案

Hyperworks软件介绍 Altair 仿真驱动设计改变了产品开发&#xff0c;使工程师能够减少设计迭代和原型测试。提升科学计算能力扩大了应用分析的机会&#xff0c;使大型设计研究能够在限定的项目时间完成。现在&#xff0c;人工智能在工程领域的应用再次改变了产品开发。基于物理…