博客
关于我
职责链模式在开源代码中的应用
阅读量:607 次
发布时间:2019-03-12

本文共 4158 字,大约阅读时间需要 13 分钟。

职责链模式的作用是将请求从链中的一个对象传递到下一个对象,直到请求最终被响应处理为止。这种设计方式能够有效地去除对象之间的耦合,使系统更加灵活和可扩展。

案例一:Servlet中的Filter链

在Servlet 2.3版本中,Filter和FilterChain接口被引入,其中FilterChain实现了职责链模式。Filter接口定义了一个doFilter方法,但如果链中没有其他Filter,则调用链将停止执行。下面是Filter和FilterChain的接口定义:

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

FilterChain接口仅定义了一个方法doFilter,用来控制下一个Filter的执行顺序。下面的代码展示了FilterChain的简单实现,称为VirtualFilterChain,它负责管理额外的Filter和原有的Filter链:

private static class VirtualFilterChain implements FilterChain {    private final FilterChain originalChain;    private final List
additionalFilters; private int currentPosition = 0; public VirtualFilterChain(FilterChain chain, List
additionalFilters) { this.originalChain = chain; this.additionalFilters = additionalFilters; } @Override public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { if (this.currentPosition == this.additionalFilters.size()) { this.originalChain.doFilter(request, response); } else { this.currentPosition++; Filter nextFilter = this.additionalFilters.get(this.currentPosition - 1); nextFilter.doFilter(request, response, this); } }}

这种实现方式允许开发者灵活地管理多个Filter,并确保它们按正确的顺序执行。


案例二:Spring中的拦截器链

在Spring框架中,HandlerInterceptor和HandlerExecutionChain也采用了职责链模式。HandlerInterceptor定义了三个关键方法:

  • preHandle:在处理请求之前执行。
  • postHandle:在响应生成之后执行。
  • afterCompletion:在请求处理完成后执行。

HandlerExecutionChain管理多个拦截器,并按特定顺序调用它们。以下是HandlerExecutionChain的关键实现代码:

public class HandlerExecutionChain {    private HandlerInterceptor[] interceptors;    private int interceptorIndex;    public void applyPreHandle(HttpServletRequest request, HttpServletResponse response)         throws Exception {        if (!this.interceptors Empty(interceptors)) {            for (int i = 0; i < interceptors.length; i++) {                HandlerInterceptor interceptor = interceptors[i];                if (!interceptor.preHandle(request, response, this)) {                    triggerAfterCompletion(request, response, null);                    return false;                }                this.interceptorIndex = i;            }        }        return true;    }    public void applyPostHandle(HttpServletRequest request, HttpServletResponse response, ModelAndView mv)         throws Exception {        if (!this.interceptors Empty(interceptors)) {            for (int i = interceptors.length - 1; i >= 0; i--) {                HandlerInterceptor interceptor = interceptors[i];                interceptor.postHandle(request, response, this.handler, mv);            }        }    }    public void triggerAfterCompletion(HttpServletRequest request, HttpServletResponse response, Exception ex)         throws Exception {        if (!this.interceptors Empty(interceptors)) {            for (int i = this.interceptorIndex; i >= 0; i--) {                HandlerInterceptor interceptor = interceptors[i];                try {                    interceptor.afterCompletion(request, response, this.handler, ex);                } catch (Throwable ex2) {                    logger.error("HandlerInterceptor.afterCompletion threw exception", ex2);                }            }        }    }}

DispatcherServlet在调用HandlerAdapter之前,会调用HandlerExecutionChain的applyPreHandle方法,并在响应生成后调用applyPostHandle方法。需要注意的是,如果applyPreHandle返回false,会触发afterCompletion方法处理异常情况。


【Java学习资源】整理推荐

以下是一些经典的Java学习资源推荐:

  • 《Effective Java》:这本书系统讲解了Java语言的最佳实践。
  • 《Java Concurrency in Practice》:深入探讨Java的并发编程。
  • 《The Java Collections Library》:全面理解Java集合框架。
  • 《Clean Architecture》:指导构建可维护的软件架构。
  • 《 Design Patterns》:学习经典的设计模式。

  • 【Java面试题与答案】整理推荐

    以下是一些常见的Java面试题及其答案:

  • What is the difference between List and Collection?
    • List是有序集合,支持快速随机访问,而Collection是无序集合。
  • Explain singleton enum in Java.
    • enum的单例模式通过static字段实现。
  • How to handle thread safety in Java concurrency.
    • 使用synchronized关键字、 lock锁、夹缝锁等。

  • 通过上述案例,可以清晰地看到职责链模式在不同框架中的应用和优势。在实际开发中,它能够有效地降低代码耦合度,提高系统的扩展性和可维护性。

    转载地址:http://fgaxz.baihongyu.com/

    你可能感兴趣的文章
    MySQL 中日志的面试题总结
    查看>>
    mysql 中的all,5分钟了解MySQL5.7中union all用法的黑科技
    查看>>
    MySQL 中的外键检查设置:SET FOREIGN_KEY_CHECKS = 1
    查看>>
    Mysql 中的日期时间字符串查询
    查看>>
    mysql 中索引的问题
    查看>>
    MySQL 中锁的面试题总结
    查看>>
    MySQL 中随机抽样:order by rand limit 的替代方案
    查看>>
    MySQL 为什么需要两阶段提交?
    查看>>
    mysql 为某个字段的值加前缀、去掉前缀
    查看>>
    mysql 主从
    查看>>
    mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
    查看>>
    mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
    查看>>
    mysql 主从关系切换
    查看>>
    MYSQL 主从同步文档的大坑
    查看>>
    mysql 主键重复则覆盖_数据库主键不能重复
    查看>>
    Mysql 事务知识点与优化建议
    查看>>
    Mysql 优化 or
    查看>>
    mysql 优化器 key_mysql – 选择*和查询优化器
    查看>>
    MySQL 优化:Explain 执行计划详解
    查看>>
    Mysql 会导致锁表的语法
    查看>>