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

【设计模式】聊聊职责链模式

原理和实现

模板模式变化的是其中一个步骤,而责任链模式变化的是整个流程。
将请求的发送和接收解耦合,让多个接收对象有机会可以处理这个请求,形成一个链条。不同的处理器负责自己不同的职责。

定义接口

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就是职责链的体现。

http://www.lryc.cn/news/238541.html

相关文章:

  • 【C++进阶之路】第五篇:哈希
  • CentOS基Docker容器时区配置解决方案
  • 探索 Material 3:全新设计系统和组件库的介绍
  • 《多GPU大模型训练与微调手册》
  • 【C++】const与类(const修饰函数的三种位置)
  • 深度学习在图像识别中的革命性应用
  • R语言读文件“-“变成“.“
  • RabbitMQ 基础操作
  • 自然语言处理:Transformer与GPT
  • Ps:裁剪工具 - 裁剪预设的应用
  • 前端工程化-什么是构建工具
  • 01-论文阅读-Deep learning for anomaly detection in log data: a survey
  • 图像处理02 matlab中NSCT的使用
  • 提升办公效率,畅享多功能办公笔记软件Notion for Mac
  • Apache Airflow (十三) :Airflow分布式集群搭建及使用-原因及
  • # 聚类系列(一)——什么是聚类?
  • Android DatePicker(日期选择器)、TimePicker(时间选择器)、CalendarView(日历视图)- 简单应用
  • linux环境搭建mysql5.7总结
  • SQL Server Count()函数
  • 架构探索之路-第一站-clickhouse | 京东云技术团队
  • 易航网址引导系统 v1.9 源码:去除弹窗功能的易航网址引导页管理系统
  • 创新无界:通义灵码在测试过程中展现的独特魅力
  • crmchat安装搭建教程文档 bug问题调试
  • Golang http 请求如何设置代理
  • 电子眼与无人机在城市安防中的协同应用研究
  • LVS+keepalived——高可用集群
  • 使用 AWS boto3 库从 s3 桶中批量下载数据
  • js ::after简单实战
  • 数据结构与算法实验(黑龙江大学)
  • 如何使用rclone将腾讯云COS桶中的数据同步到华为云OBS