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

职责链模式

职责链模式

责任链(Chain of Responsibility)模式:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

案例

实习一个tomcat的过滤器链 A -> B -> C -> 目标方法 -> C -> B -> A

目标方法:

public class My {public void hello(){System.out.println("hello world");}
}

request和response:

public class HttpRequest {String msg;public HttpRequest(String msg) {this.msg = msg;}
}
public class HttpResponse {String content;public HttpResponse(String content) {this.content = content;}
}

过滤器:

public interface Filter {void doFilter(HttpRequest request,HttpResponse response,FilterChain chain);
}
public class HttpFilter implements Filter{@Overridepublic void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) {System.out.println("HttpFilter正在执行");chain.doFilter(request,response,chain);System.out.println("HttpFilter已返回");}
}
public class CharacterFilter implements Filter{@Overridepublic void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) {System.out.println("CharacterFilter 正在执行");chain.doFilter(request,response,chain);System.out.println("CharacterFilter 已返回");}
}
public class EncodingFilter implements Filter{@Overridepublic void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) {System.out.println("EncodingFilter 正在执行");chain.doFilter(request,response,chain);System.out.println("EncodingFilter 已返回");}
}

过滤器链:

public class FilterChain implements Filter{private int cursor = 0;private List<Filter> filters = new ArrayList<>();private My target;public FilterChain(My target) {this.target = target;}public void addFilter(Filter filter){filters.add(filter);}@Overridepublic void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) {if(cursor < filters.size()){Filter filter = filters.get(cursor);cursor++;filter.doFilter(request,response,chain);}else{target.hello();}}
}

测试:

public class Main {public static void main(String[] args) {My my = new My();FilterChain filterChain = new FilterChain(my);filterChain.addFilter(new HttpFilter());filterChain.addFilter(new CharacterFilter());filterChain.addFilter(new EncodingFilter());filterChain.doFilter(new HttpRequest("request"),new HttpResponse("response"),filterChain);}
}

相关文章:

职责链模式

职责链模式 责任链&#xff08;Chain of Responsibility&#xff09;模式&#xff1a;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链&#xff1b;当有请求发生时&#xff0c;可将请求沿着这…...

新品 | Teledyne FLIR IIS 推出Forge 1GigE SWIR 短波红外工业相机系列

近日&#xff0c;51camera的合作伙伴Teledyne FLIR IIS推出了新品Forge 1GigE SWIR 130万像素的红外相机。 Forge 1GigE SWIR系列的首款相机配备宽频带、高灵敏度的Sony SenSWIR™️ 130万像素IMX990 InGaAs传感器。这款先进的传感器采用5um像素捕捉可见光和SWIR光谱&#xff…...

深入MySQL:掌握索引、事务、视图、存储过程与性能优化

在掌握了MySQL的基本操作之后&#xff0c;你可能会遇到更复杂的数据管理和优化需求。本文将介绍一些MySQL的进阶特性&#xff0c;包括索引、事务、视图、存储过程和函数、以及性能优化等内容。通过学习这些高级功能&#xff0c;你可以更高效地管理和优化你的数据库。 索引 索…...

【WSL——Windows 上使用 Linux 环境】

引入 以前在windows上使用linux工具链&#xff0c;一般都要安装虚拟机&#xff08;VMware/virtualBox)。虚拟机的缺点是&#xff0c;因为是完整的虚拟环境&#xff0c;消耗系统资源比较多。 windows自己开发了WSL功能&#xff0c;实现了虚拟机的功能&#xff0c;但是比虚拟机性…...

Redis:事务

什么是Redis事务 Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令&#xff0c;一个事务中所有命令都会被序列化。在事务执行过程&#xff0c;会按照顺序串行化执行队列中的命令&#xff0c;其他客户端提交的命令请求不会插入到事务执行命令序列中。 总结说&…...

策略模式的介绍和具体实现

❤ 作者主页&#xff1a;李奕赫揍小邰的博客 ❀ 个人介绍&#xff1a;大家好&#xff0c;我是李奕赫&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 记得点赞、收藏、评论⭐️⭐️⭐️ &#x1f4e3; 认真学习!!!&#x1f389;&#x1f389; 文章目录 策略接口三种…...

MySQL InnoDB MVCC数据结构分析

1、概述 MVCC&#xff08;Multiversion Concurrency Control&#xff09;多版本并发控制&#xff0c;通过维护不同的版本号&#xff0c;提供一种很好的并发控制技术&#xff0c;这种技术能够使读写操作不冲突&#xff0c;提升并发性能。 MySQL InnoDB存储引擎&#xff0c;在更…...

MySQL 8 查看 SQL 语句的执行进度

目录 1. 查询各阶段执行进度 &#xff08;1&#xff09;开启收集与统计汇总执行阶段信息的功能 &#xff08;2&#xff09;确定执行的SQL所属的thread_id &#xff08;3&#xff09;查询各阶段的执行进度 2. 查询SQL语句的整体执行进度 1. 查询各阶段执行进度 &#xff0…...

OpenStack 部署实践与原理解析 - Ubuntu 22.04 部署 (DevStack)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言OpenStack 原理详解1. OpenStack 的架构2. OpenStack 的工作原理3. OpenStack 的 API4. 扩展性和模块化 OpenStack 安装方式比较1. DevStack2. Kolla3. OpenSta…...

【软件工程】可行性研究

一、目的 二、任务 三、步骤 四、结果&#xff1a;可行性研究报告 例题 选择题...

乌克兰因安全风险首次禁用Telegram

据BleepingComputer消息&#xff0c;乌克兰国家网络安全协调中心 &#xff08;NCCC&#xff09; 以国家安全为由&#xff0c;已下令限制在政府机构、军事单位和关键基础设施内使用 Telegram 消息应用程序。 这一消息通过NCCC的官方 Facebook 账号对外发布&#xff0c;在公告中乌…...

[SDX35]SDX35如何查看GPIO的Base值

SDX35 SDX35介绍 SDX35设备是一种多模调制解调器芯片,支持 4G/5G sub-6 技术。它是一个4nm芯片专为实现卓越的性能和能效而设计。它包括一个 1.9 GHz Cortex-A7 应用处理器。 SDX35主要特性 ■ 3GPP Rel. 17 with 5G Reduced Capability (RedCap) support. Backward compati…...

【Linux学习】【Ubuntu入门】2-1-1 vim编辑器设置

设置TAB键为4字节及显示行号 VIM编辑器默认TAB键为8空格&#xff0c;改为4空格 输入命令sudo vi /etc/vim/vimrc回车后输入密码按键盘下键到最后&#xff0c;按下“a”进入编辑模式&#xff0c;输入set ts4设置为4空格下一行输入set nu显示行号...

全栈开发(一):springBoot3+mysql初始化

1.开发环境准备 1.开发工具 2.jdk下载 官网下载java17 3.java环境变量配置 用户变量&#xff1a; ①.JAVA_HOME ②.path 4.mysql下载 b站随便搜 5.新建项目 6.maven配置 可以下载zip放到目录里 这里是配置好的 repository文件夹&#xff1a;为maven提供下载的文件存放…...

有关若依登录过程前端的对应处理学习

导言 在用C#搞完个后端后想用若依的前端做对接&#xff0c;不过很久没搞过若依了&#xff0c;想趁这个二次开发的过程记录熟悉一下登录的过程 过程 验证&#xff0c;在permission.js的路由守卫&#xff0c;这里在用户发起api请求时会验证用户的请求是否有token&#xff0c;对…...

django使用笔记6--docker部署

django使用笔记--docker部署 多环境配置创建环境变量配置文件静态资源配置dockerfile配置 由于服务器中python版本和依赖与本地开发环境不同&#xff0c;且centOS7中python及依赖安装更新较为麻烦&#xff0c;所以采用docker容器部署 多环境配置 多环境配置类似Spring中的多环…...

高性能、高可靠,MK SD卡让数据存储无忧!

文章目录 SD卡&#xff08;Secure Digital Memory Card&#xff09;&#xff0c;作为当代数字生活中不可或缺的存储媒介&#xff0c;凭借其卓越的数据传输效率、灵活的热插拔功能以及惊人的存储容量&#xff0c;在多个领域大放异彩。从日常使用的智能手机、平板电脑到追求极致体…...

NetAssist测试TCP和UDP

由于在Windows下经常使用NetAssist.exe这款网络调试工具进行TCP、UDP的服务端、客户端的监听&#xff0c;对于需要编写各种通信协议的TCP服务端、客户端以及UDP通信程序来说是很方便的。下载地址&#xff1a;http://free.cmsoft.cn/download/cmsoft/assistant/netassist5.0.14.…...

mcuboot使用介绍

准备工作 硬件平台选择 确保你的微控制器单元&#xff08;MCU&#xff09;是 MCUboot 所支持的类型。查看 MCUboot 的文档或官方支持列表&#xff0c;了解其兼容的 MCU 系列和硬件平台。根据硬件平台的设计&#xff0c;将微控制器与相关的外设&#xff08;如闪存、通信接口等&a…...

如何在 Linux 终端使用 GET 和 POST 请求

文章目录 1、GET请求基本请求带有请求头带有参数将响应保存成文件 2、POST请求基本请求发送JSON格式的POST请求体使用文件作为POST请求体使用时注意 1、GET请求 基本请求 在Linux中&#xff0c;发送GET请求通常使用 curl 命令&#xff0c;curl 的默认行为就是发送GET请求&…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...