Java设计模式之职责链模式

职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,用于将请求的发送者和接收者解耦,并使多个对象都有机会处理这个请求。在职责链模式中,请求沿着一个链传递,直到有一个对象处理它为止。

在职责链模式中,通常有以下几个角色:

  1. 抽象处理者(Handler):定义处理请求的接口,并维护一个指向下一个处理者的引用。通常包含一个处理方法,用于处理请求或将请求传递给下一个处理者。
  2. 具体处理者(ConcreteHandler):实现抽象处理者接口,具体处理请求的逻辑。如果自己无法处理请求,可以将请求传递给下一个处理者。
  3. 客户端(Client):创建职责链,并将请求发送给链中的第一个处理者。

下面是一个简单的示例,说明职责链模式的工作原理:

// 抽象处理者
public abstract class Handler {private Handler nextHandler;public void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}public void handleRequest(Request request) {if (canHandle(request)) {processRequest(request);} else if (nextHandler != null) {nextHandler.handleRequest(request);} else {// 没有处理者能够处理该请求System.out.println("No handler found for the request.");}}protected abstract boolean canHandle(Request request);protected abstract void processRequest(Request request);
}// 具体处理者A
public class ConcreteHandlerA extends Handler {@Overrideprotected boolean canHandle(Request request) {// 判断是否能够处理该请求return request.getType().equals("A");}@Overrideprotected void processRequest(Request request) {// 处理请求的逻辑System.out.println("ConcreteHandlerA is handling the request.");}
}// 具体处理者B
public class ConcreteHandlerB extends Handler {@Overrideprotected boolean canHandle(Request request) {// 判断是否能够处理该请求return request.getType().equals("B");}@Overrideprotected void processRequest(Request request) {// 处理请求的逻辑System.out.println("ConcreteHandlerB is handling the request.");}
}// 请求类
public class Request {private String type;public Request(String type) {this.type = type;}public String getType() {return type;}
}// 客户端代码
public class Client {public static void main(String[] args) {// 创建处理者Handler handlerA = new ConcreteHandlerA();Handler handlerB = new ConcreteHandlerB();// 设置处理者的下一个处理者handlerA.setNextHandler(handlerB);// 创建请求Request requestA = new Request("A");Request requestB = new Request("B");Request requestC = new Request("C");// 发送请求handlerA.handleRequest(requestA); // 输出:ConcreteHandlerA is handling the request.handlerA.handleRequest(requestB); // 输出:ConcreteHandlerB is handling the request.handlerA.handleRequest(requestC); // 输出:No handler found for the request.}
}

在上面的示例中,抽象处理者(Handler)定义了处理请求的接口,并维护了一个指向下一个处理者的引用。具体处理者(ConcreteHandlerA和ConcreteHandlerB)实现了抽象处理者接口,并根据自身的能力判断是否能够处理请求。如果自己无法处理请求,就将请求传递给下一个处理者。客户端(Client)创建职责链,并将请求发送给链中的第一个处理者。

在示例中,请求类型为"A"的请求会被ConcreteHandlerA处理,请求类型为"B"的请求会被ConcreteHandlerB处理,而请求类型为"C"的请求没有任何处理者能够处理,最终输出"No handler found for the request."。

职责链模式的优点是将请求的发送者和接收者解耦,增加了系统的灵活性。同时,职责链模式也有可能导致请求的处理链过长,影响性能,因此在使用时需要注意控制链的长度。

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

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

相关文章

【肌电信号】OpenSignals使用方法 --- 肌电信号采集及导入matlab

一、 多通道采集教学 1. 数据线连接 将PLUX设备通过USB或蓝牙与电脑连接,注意确认在几号通道接线。 2.实时数据采集可视化 进行设置。需要在软件中选择你的PLUX设备,并配置相关的参数,如采样率、分辨率、信号类型等 3 支持数据回放和…

只需根据接口文档,就能轻松开发 get 和 post 请求的脚本,你会做吗?

一般的接口文档描述的内容: 开发get请求的脚本,接口文档的描述如下: 在loadrunner里面创建一个空脚本: 在action空白处,点击insert—>step 输入web_custom_request,双击选择该函数,填入如下几…

【Linux】常用命令

目录 文件解压缩服务器文件互传scprsync 进程资源网络curl发送简单get请求发送 POST 请求发送 JSON 数据保存响应到文件 文件 ls,打印当前目录下所有文件和目录; ls -l,打印每个文件的基本信息 pwd,查看当前目录的路径 查看文件 catless:可以左右滚动阅读more :翻…

什么是C++?

1.什么是C C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的 程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机 界提出了OOP(object o…

智能AI创作系统ChatGPT详细搭建教程/AI绘画系统/支持GPT联网提问/支持Prompt应用/支持国内AI模型

一、智能AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统,支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作…

Flex 词法分析实验实现(电子科技大学编译技术Icoding实验)

Flex 词法分析 此为电子科技大学编译技术 实验1:词法分析 将具体实现中的三个文件和自己的实验报告一起上传才能通过 根据词法分析实验中给定的文法,利用 flex 设计一词法分析器,该分析器从标准输入读入源代码后,输出单词的类别编…

Feign 调用为何POST不支持同时传入多个SpringQueryMap对象,但是GET方法就支持?

Feign 调用为何POST不支持同时传入多个SpringQueryMap对象,但是GET方法就支持? 1.1 问题背景1.2 原因分析1.3 修复方案1.3.1 修复方案一 切换使用GET方法,可以试用多个SpringQueryMap注解 (测试实际不行)1.3.2 修复方案…

C/C++陷阱——变量名和函数名的冲突问题

C语言/C陷阱——变量名和函数名的冲突问题 先来看这两串代码&#xff1a; 代码一&#xff1a; #include <stdio.h> #include <stdlib.h>int rand 1;int main() {printf("%d\n", rand);return 0; }代码二&#xff1a; #include <stdio.h> #inc…

C++ 线程安全注解

实例开篇 线程安全注解是现代C开发的机制&#xff0c;通常在编译期可以帮助发现一些线程安全问题。 下面直接从实例中来理解。 class Account { private:Mutex mu;int money GUARDED_BY(mu);void Sub(int amount) {money - amount; // writing variable money requires h…

基于php+thinkphp+vue的校园二手交易网站

运行环境 开发语言&#xff1a;PHP 数据库:MYSQL数据库 应用服务:apache服务器 使用框架:ThinkPHPvue 开发工具:VScode/Dreamweaver/PhpStorm等均可 项目简介 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发…

43.241.18.123哪些问题会导致服务器里面时间错误

我们在使用服务器的过程中&#xff0c;有时候可能会发现&#xff0c;服务器里面时间跟标准的时间对不上&#xff0c;那服务器里面时间错误可能由哪些问题引起&#xff1a; 硬件问题&#xff1a;服务器硬件中的时钟或电池可能损坏或失效&#xff0c;导致时间不准确或重置为默认…

2024年计算机专业Java选题推荐✅(最新、最全、最容易通过的选择)

文章目录 前言选题和具体实现详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#x…

【LeetCode刷题(数据结构)】:对称二叉树

给你一个二叉树的根节点 root 检查它是否轴对称 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 提示&#xff1a; 树中节点数目在范围 [1, 1000] 内 -100 < Node.val < 100 对称二叉…

Aviator表达式引擎

一、快速介绍 &#xff08;一&#xff09;Aviator Aviator是一个用于动态表达式求值的高性能、轻量级Java引擎。以下是一些关于Aviator引擎的重要特点和设计目标&#xff1a; 轻量级和高性能&#xff1a; Aviator的设计目标之一是轻量级和高性能。它的大小很小&#xff0c;加…

PyQt中线程和线程信号的使用

PyQt中的线程和线程信号是用于在应用程序中实现多线程编程的重要概念。线程允许你在应用程序中同时执行多个任务&#xff0c;而线程信号用于在不同线程之间进行通信和协调。以下是关于PyQt中线程和线程信号的简要解释&#xff1a; 线程&#xff1a; 线程是应用程序中的并发执行…

@Component 和 @Bean的区别

Component 和 Bean 是Spring框架中用于管理和配置依赖注入的关键注解&#xff0c;用于定义和管理Spring应用程序中的组件。 Component: Component 是一种泛用型的Spring注解&#xff0c;用于标识一个类为Spring组件。Spring会自动扫描所有带有Component 注解的类&#xff0c;并…

介绍一下mysql有哪些索引类型

以下是MySQL的8种不同索引类型的比较&#xff0c;以帮助你了解它们的特点和适用场景&#xff1a; 索引类型用途和特点适用场景B-Tree 索引用于范围查询、等值查找和排序操作大多数查询 &#xff0c;不适合全文搜索和空间数据。唯一索引保证索引列的值唯一&#xff0c;不允许重…

PTA程序辅助设计平台—2023年软件设计综合实践_4(数组及字符串)

6-1 找最小元素/选择排序 - C/C 数组及字符串 &#xff08;找最小元素&#xff09;对于给定的包含10个元素的整数数组&#xff0c;设计一个函数&#xff0c;从数组给定的下标范围[i,j]里找到值最小的元素&#xff0c;返回其下标。该函数的原型可以是int findMin(int a[], int …

【Redis】Java客户端使用list命令

lpush/lrange rpush/rpop/lpop blpop/brpop llen

mac使⽤nginx

⽅法1&#xff1a;homebrew 默认本地已经安装homebrew&#xff1b; 安装与启动 brew install nginx 安装nginx&#xff1b; brew services start nginx 启动nginx nginx⽂件⽬录 1. nginx安装⽂件⽬录/usr/local/Cellar/nginx 2. nginx配置⽂件⽬录/usr/local/etc/nginx 3. con…