【设计模式】聊聊职责链模式
原理和实现
模板模式变化的是其中一个步骤,而责任链模式变化的是整个流程。
将请求的发送和接收解耦合,让多个接收对象有机会可以处理这个请求,形成一个链条。不同的处理器负责自己不同的职责。
定义接口
public interface Filter {/*** 执行过滤方法* @param request* @param response* @param filterChain*/void doFilter (Request request, Response response,FilterChain filterChain);
}
定义职责链
通过内部一个链表 将职责链添加到对应的链表中
public class FilterChain implements Filter{private static List<Filter> filterList = new LinkedList<>();private Filter myFilter;private static int filterIndex = 0;/*** 添加一个职责工作链* @param filter*/public void addFilter (Filter filter) {filterList.add(filter);}public void addMyFilter (Filter filter) {myFilter = filter;}@Overridepublic void doFilter(Request request, Response response, FilterChain filterChain) {if (filterIndex < filterList.size()) {Filter filter = filterList.get(filterIndex);filterIndex++;filter.doFilter(request,response,filterChain);} else {myFilter.doFilter(request,response,filterChain);}}
}
public class HttpFilter implements Filter{@Overridepublic void doFilter(Request request, Response response, FilterChain filterChain) {System.out.println("httpFilter before...");filterChain.doFilter(request,response,filterChain);System.out.println("httpFilter after...");}
}
public class MyFilter implements Filter{@Overridepublic void doFilter(Request request, Response response, FilterChain filterChain) {System.out.println("MyFilter before...");System.out.println("hahaha 我是中间执行人");System.out.println("MyFilter after...");}
}
public class EncodingFilter implements Filter{@Overridepublic void doFilter(Request request, Response response, FilterChain filterChain) {System.out.println("EncodingFilter before...");filterChain.doFilter(request,response,filterChain);System.out.println("EncodingFilter after...");}
}
public static void main(String[] args) {FilterChain filterChain = new FilterChain();Filter httpFilter = new HttpFilter();Filter encodingFilter = new EncodingFilter();Filter myFilter = new MyFilter();filterChain.addFilter(httpFilter);filterChain.addFilter(encodingFilter);filterChain.addMyFilter(myFilter);filterChain.doFilter(new Request(),new Response(),filterChain);}
其实不管是模板模式、策略模式、职责链模式 本质都是为了提高代码的拓展性、应对代码的复杂性,并且如果新增一个过滤器,那么只需要进行拓展、也满足开闭原则。
在实际的工作中,需要考虑什么场景下符合,就采用对应的设计模式,而不要乱用。
servlet中Filter就是职责链的体现。
相关文章:
【设计模式】聊聊职责链模式
原理和实现 模板模式变化的是其中一个步骤,而责任链模式变化的是整个流程。 将请求的发送和接收解耦合,让多个接收对象有机会可以处理这个请求,形成一个链条。不同的处理器负责自己不同的职责。 定义接口 public interface Filter {/*** …...
【C++进阶之路】第五篇:哈希
文章目录 一、unordered系列关联式容器1.unordered_map(1)unordered_map的介绍(2)unordered_map的接口说明 2. unordered_set3.性能对比 二、底层结构1.哈希概念2.哈希冲突3.哈希函数4.哈希冲突解决(1)闭散…...
CentOS基Docker容器时区配置解决方案
配置Docker容器的时区对于确保应用程序正确处理日期和时间至关重要。当使用CentOS作为基础镜像时,可以通过以下两种方法配置时区: 方法一:在Dockerfile中设置时区 这种方法涉及在构建Docker镜像的过程中设置时区。 步骤 选择基础镜像&…...
探索 Material 3:全新设计系统和组件库的介绍
探索 Material 3:全新设计系统和组件库的介绍 一、Material 3 简介1.1 Material 3 的改进和更新1.2 Material 3 的优势特点 二、Material 3 主题使用2.1 使用 Material3 主题2.2 使用 Material3 主题颜色 三、Material 3 组件使用3.1 MaterialButton:支持…...
《多GPU大模型训练与微调手册》
全参数微调 Lora微调 PTuning微调 多GPU微调预备知识 1. 参数数据类型 torch.dtype 1.1 半精度 half-precision torch.float16:fp16 就是 float16,1个 sign(符号位),5个 exponent bits(指数位),10个 ma…...
【C++】const与类(const修饰函数的三种位置)
目录 const基本介绍 正文 前: 中: 后: 拷贝构造使用const 目录 const基本介绍 正文 前: 中: 后: 拷贝构造使用const const基本介绍 const 是 C 中的修饰符,用于声明常量或表示不可修改的对象、函数或成员函数。 我们已经了解了const基本用法,我们先进行…...
深度学习在图像识别中的革命性应用
深度学习在图像识别中的革命性应用标志着计算机视觉领域的重大进步。以下是深度学习在图像识别方面的一些革命性应用: 1. **卷积神经网络(CNN)的崭新时代**: - CNN是深度学习在图像识别中的核心技术,通过卷积层、池化…...
R语言读文件“-“变成“.“
R语言读取文件时发生"-"变成"." 如果使用read.table函数,需要 check.namesFALSE data <- read.table("data.tsv", headerTRUE, row.names1, check.namesFALSE)怎样将"."还原为"-" 方法一:gsub函…...
RabbitMQ 基础操作
概念 从计算机术语层面来说,RabbitMQ 模型更像是一种交换机模型。 Queue 队列 Queue:队列,是RabbitMQ 的内部对象,用于存储消息。 RabbitMQ 中消息只能存储在队列中,这一点和Kafka相反。Kafka将消息存储在topic&am…...
自然语言处理:Transformer与GPT
Transformer和GPT(Generative Pre-trained Transformer)是深度学习和自然语言处理(NLP)领域的两个重要概念,它们之间存在密切的关系但也有明显的不同。 1 基本概念 1.1 Transformer基本概念 Transformer是一种深度学…...
Ps:裁剪工具 - 裁剪预设的应用
裁剪工具提供了两种类型的裁剪方式。 一种是仅按宽高比(比例)进行裁剪,常在对图像进行二次构图时采用。 另一种则按指定的图像尺寸(宽度值和高度值)及分辨率(宽 x 高 x 分辨率)进行裁剪。其实质…...
前端工程化-什么是构建工具
了解构建工具之前,我们首先要知道的是浏览器只认识html、css、js,而我们开发时用的vue,react框架都只是为了方便我们开发而使用的工具 使用构建工具的原因 vue或react的企业级项目里都会具备这些功能: 1.使用typescript语言&…...
01-论文阅读-Deep learning for anomaly detection in log data: a survey
01-论文阅读-Deep learning for anomaly detection in log data: a survey 文章目录 01-论文阅读-Deep learning for anomaly detection in log data: a survey摘要I 介绍II 背景A 初步定义B 挑战 III 调查方法A 搜索策略B 审查的功能 IV 调查结果A 文献计量学B 深度学习技术C …...
图像处理02 matlab中NSCT的使用
06 matlab中NSCT的使用 最近在学习NSCT相关内容,奈何网上资源太少,简单看了些论文找了一些帖子才懂了一点点,在此分享给大家,希望有所帮助。 一.NSCT流程 首先我们先梳理一下NSCT变换的流程,只有清楚流程才更好的理清…...
提升办公效率,畅享多功能办公笔记软件Notion for Mac
在现代办公环境中,高效的笔记软件对于提高工作效率至关重要。而Notion for Mac作为一款全能的办公笔记软件,将成为你事业成功的得力助手。 Notion for Mac以其多功能和灵活性而脱颖而出。无论你是需要记录会议笔记、管理项目任务、制定流程指南…...
Apache Airflow (十三) :Airflow分布式集群搭建及使用-原因及
🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹…...
# 聚类系列(一)——什么是聚类?
目前在做聚类方面的科研工作, 看了很多相关的论文, 也做了一些工作, 于是想出个聚类系列记录一下, 主要包括聚类的概念和相关定义、现有常用聚类算法、聚类相似性度量指标、聚类评价指标、 聚类的应用场景以及共享一些聚类的开源代码 下面正式进入该系列的第一个部分ÿ…...
Android DatePicker(日期选择器)、TimePicker(时间选择器)、CalendarView(日历视图)- 简单应用
示意图: layout布局文件:xml <?xml version"1.0" encoding"utf-8"?> <ScrollView xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"…...
linux环境搭建mysql5.7总结
以下安装方式,在阿里云与腾讯云服务器上都测试可用。 一、进入到opt目录下,执行: [rootmaster opt]# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz解压: [rootmaster opt]#…...
SQL Server Count()函数
SQL Server Count()函数 SQL Server COUNT() 是一个聚合函数,它返回在集合中找到的项目数。 COUNT() 函数语法: COUNT([ALL | DISTINCT ] expression)ALL 指示COUNT() 函数应用于所有值。ALL是默认值。返回非NULL值的数量(包括重复值&…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...
RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema,不需要复杂的查询,只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 :在几秒钟…...
