责任链模式在JDK源码中的应用
本节主要介绍责任链模式在 JDK 中的应用。下面来看一个 JDK 中常见的 Filter 类,源码如下。
FilterChain 是 J2EE 规范定义的一个拦截器接口,源码如下。
实际上,J2EE 只定义了一个规范,具体处理逻辑是由使用者自己来实现的。下面来看一下 Spring 中实现了 FilterChain 接口的 MockFilterChain 类。
public interface Filter { void init(FilterConfig var1) throws ServletException; void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; void destroy(); }Filter 接口的定义非常简单,相当于责任链模式中的 Handler 抽象角色,那么它是如何形成一条责任链的呢?可以看到 doFilter() 方法的最后一个参数类型是 FilterChain。下面来看 FilterChain 接口。
FilterChain 是 J2EE 规范定义的一个拦截器接口,源码如下。
public interface FilterChain { void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException; }可以看到,FilterChain 类中只定义了一个 doFilter() 方法,并没有维护一个链里面的下一个对象,那么它们是怎么串联成一个责任链,实现链路传递的呢?
实际上,J2EE 只定义了一个规范,具体处理逻辑是由使用者自己来实现的。下面来看一下 Spring 中实现了 FilterChain 接口的 MockFilterChain 类。
public class MockFilterChain implements FilterChain { @Nullable private ServletRequest request; @Nullable private ServletResponse response; private final List<Filter> filters; @Nullable private Iterator<Filter> iterator; ... @Override public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { Assert.notNull(request, "Request must not be null"); Assert.notNull(response, "Response must not be null"); Assert.state(this.request == null, "This FilterChain has already been called!"); if (this.iterator == null) { this.iterator = this.filters.iterator(); } if (this.iterator.hasNext()) { Filter nextFilter = this.iterator.next(); nextFilter.doFilter(request, response, this); } this.request = request; this.response = response; } ... }可以看出,MockFilterChain 类把链条中的所有 Filter 都放到了 List 中,子类通过 List 来构建链路,然后在调用 doFilter() 方法时循环迭代 List 来实现“链路”传递。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算