职责链模式(Chain of responsibility)以及servlet中filter的原理

先看经典职责链代码,

(代码来自维基)

package pattern;

import java.io.*;

abstract class PurchasePower {

protected final double base = 500;
protected PurchasePower successor;

public void setSuccessor(PurchasePower successor) {
this.successor = successor;
}

abstract public void processRequest(PurchaseRequest request);
}

class ManagerPPower extends PurchasePower {
private final double ALLOWABLE = 10 * base;

public void processRequest(PurchaseRequest request) {
if (request.getAmount() < ALLOWABLE)
System.out.println("Manager will approve $" + request.getAmount());
else if (successor != null)
successor.processRequest(request);
}
}

class DirectorPPower extends PurchasePower {
private final double ALLOWABLE = 20 * base;

public void processRequest(PurchaseRequest request) {
if (request.getAmount() < ALLOWABLE)
System.out.println("Director will approve $" + request.getAmount());
else if (successor != null)
successor.processRequest(request);
}
}

class VicePresidentPPower extends PurchasePower {
private final double ALLOWABLE = 40 * base;

public void processRequest(PurchaseRequest request) {
if (request.getAmount() < ALLOWABLE)
System.out.println("Vice President will approve $"
+ request.getAmount());
else if (successor != null)
successor.processRequest(request);
}
}

class PresidentPPower extends PurchasePower {
private final double ALLOWABLE = 60 * base;

public void processRequest(PurchaseRequest request) {
if (request.getAmount() < ALLOWABLE)
System.out
.println("President will approve $" + request.getAmount());
else
System.out.println("Your request for $" + request.getAmount()
+ " needs a board meeting!");
}
}

class PurchaseRequest {

private int number;
private double amount;
private String purpose;

public PurchaseRequest(int number, double amount, String purpose) {
this.number = number;
this.amount = amount;
this.purpose = purpose;
}

public double getAmount() {
return amount;
}

public void setAmount(double amt) {
amount = amt;
}

public String getPurpose() {
return purpose;
}

public void setPurpose(String reason) {
purpose = reason;
}

public int getNumber() {
return number;
}

public void setNumber(int num) {
number = num;
}
}

public class CheckAuthority {
public static void main(String[] args) {
ManagerPPower manager = new ManagerPPower();
DirectorPPower director = new DirectorPPower();
VicePresidentPPower vp = new VicePresidentPPower();
PresidentPPower president = new PresidentPPower();
manager.setSuccessor(director);
director.setSuccessor(vp);
vp.setSuccessor(president);

// enter ctrl+c to kill.
try {
while (true) {
System.out
.println("Enter the amount to check who should approve your expenditure.");
System.out.print(">");
double d = Double.parseDouble(new BufferedReader(
new InputStreamReader(System.in)).readLine());
manager.processRequest(new PurchaseRequest(0, d, "General"));
}
} catch (Exception e) {
System.exit(1);
}
}
}


这段代码实现了不同审批限额由不同级别的人去审批的功能。

该模式有如下特点:

1. 几个对象组成链表结构,用来向后传递请求;
2. 请求被处理,则返回;否则继续向后传递;(有的实现则是不论请求是否被处理,都向后传递)。
3. 对象都继承自同一个父类或实现了共同的用来处理请求的接口。

优点:

1. 发起者(调用者)与接收者分离。
2. 可动态插入职责链。

缺点:

1. 遍历链表有性能损耗。

职责链模式的经典应用是Servlet中的的Filter技术。略过Filter的很简单的使用
方法,我们来看看它在tomcat中的实现。为了说明方便,这里只是它的实现的一
个简化演示代码。

用户自定义的filter都需实现了如下的Filter接口,

doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws java.io.IOException,ServletException

用户在这个接口里写的代码可以截获请求。对截获的请求处理后,可以把处理权
传递给下一个filter。传递给下一个filter的方法是调用如下一行代码,

chain.doFilter(request,response);

这行代码是Servlet里的Filter技术的核心,所以接下来我们主要就是分析、模拟
这行代码做了什么,它是如何把请求传递给下一个filter的,下一个filter是何
时被创建的。

下面是对整个过程的简单模拟。很简单,就是读配置文件,生成多个
ApplicationFilterConfig对象(称呼它为配置对象),该配置对象负责生成
filter对象。

final class ApplicationFilterChain implements FilterChain {
private List filterConfigs = new ArrayList();
private Iterator iterator = null;

public void doFilter(ServletRequest request, ServletResponse response) {
if (this.iterator == null)
this.iterator = filters.iterator();

if (this.iterator.hasNext()) {
ApplicationFilterConfig filterConfig = (ApplicationFilterConfig) iterator
.next();// 在这里取得下一个filter的配置对象
Filter filter = filterConfig.getFilter();// 注意:在这里取得了下一个filter,这个filter就是你实现了filter接口的filter.
filter.doFilter(request, response, this);// 把请求传递个下一个filter处理
}
}

public void startFilter() {
ApplicationFilterConfig filterConfig = (ApplicationFilterConfig) iterator
.next();
Filter filter = filterConfig.getFilter();
filter.doFilter(request, response, this);
}

public void addFilterConfig(ApplicationFilterConfig filterConfig) {
filterConfigs.add(filterConfig);
}
}

final class ApplicationFilterConfig implements FilterConfig {
private Filter filter = null;
private String filterClass;

public Filter getFilter() {
if (this.filter != null)
return (this.filter);

Class clazz = classLoader.loadClass(filterClass);
this.filter = (Filter) clazz.newInstance();
return this.filter;
}
}

public class MainTest {
public FilterChain create() {
ApplicationFilterChain a = new ApplicationFilterChain();
List filters = readConfigFile();// 读取配置文件,获取filter信息,实现过程略
for (int i = 0; i < filters.size(); i++) {
ApplicationFilterConfig afc = (ApplicationFilterConfig) filters
.get(i);
a.addFilterConfig(afc);
}
return a;
}

public static void main(String args[]) {
(new MainTest()).create().startFilter();
}
}


tomcat的chain实现有3个要点,

1. 不是一下子全部初始化所有的filter对象,而是只初始化所有的配置对象。配
置对象的生成比filter对象的生成节省资源,生成配置对象只是存储了一些配置
信息。filter对象的生成需要反射,相对消耗资源。

2. 在第一次调用filter的时候,由配置对象生成filter对象。下一次再次调用则
直接使用已经生成的filter对象。缓存思路。

3. 由FilterChain维护一个链表,链表中存放着配置对象的链条,每次用户调用
一次chain.doFilter(req, res),链表就去取下一个配置对象,再通过配置对象
得到下一个filter,然后调用该filter,接着你在filter里写的逻辑就被执行了。
Java基础高级进阶篇之设计模式(详解篇三十六) 这篇文章详细介绍了Java设计模式的七大核心内容,包括设计原则、创建型/结构型/行为型模式、最佳实践、反模式和框架应用。重点解析了SOLID五大设计原则的代码示例:通过拆分用户服务类展示单一职责原则,使用策略模式演示开闭原则,用矩形/正方形案例说明里氏替换原则,接口拆分体现接口隔离原则,以及依赖注入如何实现依赖倒置原则。每个原则都配有违反和遵循的对比代码,突出了"针对接口编程"、"组合优于继承"等设计思想,为编写可维护、可扩展的代码提供了实用指导。 阅读详情

相关推荐

OpenManus本地部署实战:从源码编译到浏览器路径优化全解析

本文详细解析了OpenManus本地部署的全过程,从源码编译到浏览器路径优化。涵盖环境准备、源码获取、模型配置、依赖安装等关键步骤,特别针对Windows系统下的chrome.exe路径修改提供了实用解决方案,帮助开发者高效完成部署并优化性能。

weixin_28826545的博客 379

Servlet之Filter实现原理(责任链设计模式)

环境:Java8 Servlet中Filter使用的设计模式是责任链设计模式。我们可以定义一组Filter然后对数据进行依次的处理。责任链设计模式属于行为型模式。UML图如下: Filter执行流程如下: 接下来我们来实现一个Filter Filter.java接口 public interface Filter { void doFilter(Request request, Response response, FilterChain chain) ; } F..

asoklove的专栏 1164

Zabbix华为交换机光衰告警

zabbix使用自动发现监控huawei网络设备光衰

qq_31651649的博客 4529

责任链模式与Servlet的过滤器原理

责任链模式(Chain of Responsibility Pattern) 一,概念 一个请求传过来,有多个处理对象负责对这个请求信息进行处理。这些处理对象处理时组成一条处理链,有先后执行顺序,称为责任链模式。 例如你提交的报销单,经过组长,副经理,总经理一层层审批,其中一环审批不通过可以停止审批流程。 再举例,一条消息进入某个系统,系统里面有多个过滤文字的处理者。即过滤器或拦截器的作用 责任链的好处,在请求和最后的处理中间加了一些中间处理者,请求者不需要知道中间的过滤过程,系统还可以自由的增加减少中间

csdn_xxm的博客 773

[LaTeX] 调整参考文献的格式(References),包括作者名缩写,行距,字体,引用顺序等等

在此记录我对LaTeX中参考文献references的尝试,主要涵盖如题几个方面。

the Blog of 等不到天亮丶等时光 4万+

零基础入门红外与可见光图像融合:DAF-Net 实战全指南

本文介绍了基于DAF-Net的红外与可见光图像融合技术,主要内容包括:技术原理、环境配置、数据准备和模型实现。DAF-Net通过双分支特征提取和动态注意力融合机制,有效结合红外图像的热辐射信息与可见光图像的纹理细节。文章详细讲解了开发环境搭建步骤(Python 3.8+PyTorch),TNO数据集的预处理方法,并提供了完整的DAF-Net实现代码,包含特征提取、注意力融合和图像重建三个关键模块。该技术可广泛应用于安防监控、自动驾驶等领域,帮助开发者快速入门多模态图像融合。

FJN110的博客 123

Servlet 之 Filter的实现原理

1. 概念 filter 过滤器, 对从客户端向服务端发送的请求进行过滤,也可以对服务端返回的响应进行处理。Filter 不是Servlet,它不能产生一个response,它能否在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response。 注意: Filter 只能拦截请求和响应,不能产生响应,而servlet是用来处理请求并产生响应的 2.应用场景 权限认证 敏感词过滤 压缩响应等 3. Filter 拦截流程 ...

u011186019的专栏 1920

巨正则蒙特卡洛—甲烷和二氧化碳的竞争吸附GCMC

巨正则蒙特卡洛—甲烷和二氧化碳的竞争吸附GCMC

Rockyoung 8018

状态模式 VS 职责链模式

这次合作开发过程中我们使用了一些设计模式,经过讨论对其理解深刻不少。之前在学习之中,我本以为自己已经理解了一些设计模式。但在这次的使用过程中,因为各自的理解不一造成了一定的碰撞,之后才发现自己的理解根本就站不住脚。于是,反复经过我们的讨论——实施——再讨论,发现理解的偏差,解决之。然后,才有了目前我们认为的比较稳定的,符合逻辑的理解。本篇博客要说的是我对状态模式和职责链模式的理解。这两个设计模式看

忠麦一生 4296

【树莓派安装Homeassistant及基本配置】

时隔一年,我又重新开始玩Homeassistant,发现其中奥妙无穷,惊喜不断。在我浅薄的认知中要学好嵌入式,必须玩过Homeassistant,并且玩出自己的名堂!因为这是最贴切实际的生活应用没有之一,每月更新使得唯有活水来;拥抱大千使得永葆青春的活力;鬼斧神工的操作精彩纷呈,可以堪称软件与硬件的完美落地!

vor234的博客 1万+

告别调参难!YOLO超参数优化指南(网格搜索+贝叶斯优化实战)

YOLO超参数优化的本质,不是“试遍所有参数”,而是“用工具化方法,在场景约束内找到最优平衡”——网格搜索稳、贝叶斯优化快,两者结合(先粗搜再精调)是工业场景的最优解。先定范围:基于工业场景(小目标/边缘设备/多类别)缩小参数搜索范围,避免无效探索。先调核心:优先优化数据增强、学习率、输入尺寸,这些参数对精度影响最大。工具赋能:用网格搜索+贝叶斯优化替代人工试错,再用TensorBoard监控,让调参“有据可依”。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 698

责任链模式(Chain of Responsibility)

定义: 为请求创建了一个接收者对象的链,使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系. 需要解决的问题: 首先来看一段代码: public void test(int i, Request request){ if(i==1){ Handler1.response(request); }else ...

haoxin963的专栏 260

传统(经典)粒子群算法(PSO)解决单目标优化问题

智能算法:粒子群算法(particle swarm optimizer)—PSO %原理:(1)种群初始化–N(种群数)–D(个体数)–x(i)(粒子位置)–v(i)(粒子速度) % (2)计算每个粒子的适应度值–而适应度值需要选择适应度函数 % (3)对于每个粒子,使用它的适应度值fit[i]和个体的极值pbest(i)进行比较,如果fit[i]>pbest(i),则pbest(i)=fit[i] % (4)同理,对每个粒子用它的适应值与全局极值进行比较,如果比它大,则

weixin_51631044的博客 1295

设计模式(三) chain of responsibility ——责任链模式

设计模式三 chain of responsibility ——责任链模式 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个...

无心天成的博客 288

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Sentinel SlotChain架构解析:从责任链模式到立体流量治理

在微服务架构中,流量治理是保障系统稳定性的关键技术。其核心原理是通过一系列可插拔的处理器对请求进行链式处理,实现从流量统计到规则判断的完整管控。这种责任链模式的技术价值在于实现了职责分离与高度可扩展性,开发者可以灵活定制处理逻辑。在工程实践中,该模式广泛应用于系统保护、熔断降级、热点参数限流等场景,能够有效应对慢调用引发的级联故障和流量突刺问题。以阿里巴巴开源的Sentinel框架为例,其SlotChain机制正是这一模式的典型实现,通过NodeSelectorSlot、StatisticSlot、Flow

weixin_34060299的博客 400

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Kafka Producer拦截器实战:从监控统计到链路追踪的完整指南

在分布式消息系统中,拦截器是一种基于责任链模式的通用设计,用于处理横切关注点,实现业务逻辑与非功能性需求的解耦。其核心原理是在消息处理的关键生命周期节点插入自定义逻辑,而无需侵入核心代码。这一设计在Spring MVC、Axios等框架中广泛应用,技术价值在于提升代码的可维护性、可观测性和可扩展性。在Kafka生产者场景中,拦截器可应用于消息审计、链路追踪、动态路由等具体场景。本文聚焦于Kafka Producer拦截器的实战应用,通过实现消息审计监控统计器和链路追踪增强器两个典型拦截器,详细阐述了如何利用

weixin_30546189的博客 366

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java 23 种设计模式:从踩坑到精通 —— 开篇及系列介绍

摘要:本文是《Java 23种设计模式:从踩坑到精通》系列的总入口与导航页。文章梳理了设计模式的起源与三大分类,结合SOLID六大原则,详解为什么2026年设计模式依然重要。提供25篇完整目录、面试高频Top10速记、场景速查索引、易混模式对比表及分级阅读路线,可作为长期收藏的设计模式学习手册。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 3581

Spring Security核心架构与21种安全验证策略实战指南

在Java企业级应用开发中,认证与授权是保障系统安全的核心基础。其原理在于通过一系列过滤器链(Filter Chain)对请求进行拦截和验证,核心组件如AuthenticationManager负责协调多种认证方式,AccessDecisionManager则基于投票机制进行细粒度的访问控制。这种分层、可插拔的架构设计提供了极高的灵活性和扩展性,其技术价值在于能够系统性地应对从基础登录到复杂业务场景的安全需求。典型的应用场景包括构建无状态REST API网关、实现多因素认证(MFA)、集成第三方OAuth2

weixin_30514745的博客 305

Java 中的 23 种设计模式详解

项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

微笑听雨 7万+

JAVA面试题(1~95)《上》

1、面向对象的特征有哪些方面?  答:面向对象的特征主要有以下几个方面:  - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。  - 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性...

ywl470812087的博客 4963

责任链模式-实现和Servlet、Spring Aop、Zuul中的责任链模式分析

目录 一、责任链实现 二、Servlet、Spring Aop、Zuul中的责任链模式分析 1、Servlet中的Filter 2、Zuul中的责任链模式分析 1)、FilterFileManager 2)、ZuulServlet 3)、Spring Aop责任链模式 责任链模式定义:使多个对象都有处理请求的机会,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象串成一...

it_lihongmin的博客 778

【Java设计模式】(3)责任链Chain of Responsibility

1. 普通消息处理 假设我们在做一个BBS系统,当我们在留言的时候,如果需要对消息进行过滤处理,写下面一个消息处理类: package com.thr.chainofresponsibility; public class MsgProcessor { private String msg; public String getMsg() { return msg; } pu

scarthr的专栏 916

tomcat 责任链设计模式 底层源码剖析

今天晚上花了些时间debug了下tomcat,注意观察了下tomcat内部过滤器的实现,其实tomcat内部过滤器采用了责任链的设计模式, (其实struts2拦截器那一块采用了相似的设计模式),以下是个人对源码的解读, ApplicationFilterChain详解 首先是对该类的定义的介绍/** * Implementation of &lt;code&gt;javax.servlet...

javapolo的博客 1037

Servlet中过滤器的实现原理(源码实现)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34258078的博客 775

servlet之filter工作原理

一、Filter简介 .它使用户可以改变一个request和修改一个response,Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response.换种说法,filter其实是一个“servlet chaining“(servlet 链) 用途:不如过...

qq_30364247的博客 3062

从servlet的过滤器理解Chain Of Responsibility

public interface Filter { public void init(FilterConfig filterConfig) throws ServletException; public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain )

hf_Rover的专栏 749
上一篇: 工厂方法模式(Factory method)以及与抽象工厂(abstract factory)的区别
下一篇: 来点简单的,Adaptor 适配器模式
mmonkeyer
博客等级 码龄23年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值