java责任链模式(过滤器)

1.概叙

责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。Tomcat中的Filter就是使用了责任链模式,创建一个Filter除了要在web.xml文件中做相应配置外,还需要实现javax.servlet.Filter接口。

2.实现一个过滤器

// 模仿 javaweb的 过滤器 请求参数
class ServletRequest {
}
// 模仿 javaweb的 过滤器 请求参数
class ServletResponse {
}

//过滤器接口定义
interface Filter {
    void doFilter(ServletRequest request, ServletResponse resp, FilterChain chain);
}
// 定义一个字符过滤器
class CharFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse resp, FilterChain chain) {
        System.out.println("经过字符过滤器");
        // 继续 下一个过滤器
        chain.doFilter(request, resp, chain);
    }
}
//定义一个日志过滤器
class LogFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse resp, FilterChain chain) {
        System.out.println("经过日志过滤器");
        // 继续 下一个过滤器
        chain.doFilter(request, resp, chain);
    }
}
// 过滤执行链条
class FilterChain implements Filter {
    // 等待执行的过滤器链
    private Stack<Filter> filters = new Stack<Filter>();

    private boolean isFinish() {
        return filters.isEmpty();
    }

    public FilterChain addFilter(Filter filter) {
        if (filter != null) {
            filters.push(filter);
        }
        return this;
    }

    public void doFilter(ServletRequest request, ServletResponse resp, FilterChain chain) {
        if (isFinish()) {
            System.out.println("所有的过滤器已经执行完");
            return;
        }
        // 从栈取出一个 过滤器调用
        filters.pop().doFilter(request, resp, chain);
    }
}
//  -------------main测试类-----------------
    public static void main(String[] args) {
        // 构建执行链条
        FilterChain chain = new FilterChain();
        //获取一定顺序执行的过滤器
        Filter[] filters = getExecuteFilters();
        for (int i = filters.length - 1; i >= 0; i--) {
            chain.addFilter(filters[i]);
        }
        // 执行过滤
        chain.doFilter(new ServletRequest(), new ServletResponse(), chain);
    }

    private static Filter[] getExecuteFilters() {
        Filter[] filters = new Filter[2];
        filters[0] = new CharFilter();
        filters[1] = new LogFilter();
        return filters;
    }


执行结果:
经过字符过滤器
经过日志过滤器
所有的过滤器已经执行完

上面的结果显示了2个过滤器已经按规定的顺序在过滤器链条 FilterChain的辅助下依次完成执行。

老生常谈:深圳有爱好音乐的会打鼓(吉他,键盘,贝斯等)的程序员和其它职业可以一起交流加入我们乐队一起嗨。我的QQ:657455400

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值