设计模式 行为型模式 -- 职责链模式(JDK源码分析:FilterChain(过滤器))

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 行为型模式 -- 职责链模式(JDK源码分析:FilterChain(过滤器))相关的知识,希望对你有一定的参考价值。

设计模式 行为型模式 – 职责链模式(定义、结构、纯与不纯的职责链模、具体案例)


1. JDK源码分析:FilterChain

下面的代码都是模拟源码仿写的,是为了简化代码,突出的是职责链模式的思想。


1.1 模拟web请求Request以及web响应Response

Request.java

package com.tian.responsibility.jdk;

/**
 * @version v1.0
 * @ClassName: Request
 */
public interface Request {
}

Response.java

package com.tian.responsibility.jdk;

/**
 * @version v1.0
 * @ClassName: Response
 * @Description: TODO(一句话描述该类的功能)
 * @Author: 黑马程序员
 */
public interface Response {
}

1.2 模拟web过滤器Filter

Filter.java

package com.tian.responsibility.jdk;

/**
 * @version v1.0
 * @ClassName: Filter
 */
public interface Filter {
    public void doFilter(Request req, Response res, FilterChain c);
}

1.3 模拟实现具体过滤器

FirstFilter.java

package com.tian.responsibility.jdk;

/**
 * @version v1.0
 * @ClassName: FirstFilter
 */
public class FirstFilter implements Filter {
    public void doFilter(Request req, Response res, FilterChain chain) {
        System.out.println("过滤器1 前置处理");

        // 先执行所有request再倒序执行所有response
        chain.doFilter(req, res);

        System.out.println("过滤器1 后置处理");
    }
}

SecondFilter.java

package com.tian.responsibility.jdk;

/**
 * @version v1.0
 * @ClassName: FirstFilter
 */
public class SecondFilter implements Filter {
    public void doFilter(Request req, Response res, FilterChain chain) {
        System.out.println("过滤器2 前置处理");

        // 先执行所有request再倒序执行所有response
        chain.doFilter(req, res);

        System.out.println("过滤器2 后置处理");
    }
}

1.4 模拟实现过滤器链FilterChain

package com.tian.responsibility.jdk;

import java.util.ArrayList;
import java.util.List;

/**
 * @version v1.0
 * @ClassName: FilterChain
 */
public class FilterChain { //过滤器链

    private List<Filter> filters = new ArrayList<Filter>();

    private int index = 0;

    // 构造职责类:链式调用
    public FilterChain addFilter(Filter filter) {
        this.filters.add(filter);
        return this;
    }

    public void doFilter(Request request, Response response) {
        if (index == filters.size()) {
            return;
        }
        Filter filter = filters.get(index);
        index++;
        filter.doFilter(request, response, this);
    }
}

1.5 客户端类:测试类

package com.tian.responsibility.jdk;

/**
 * @version v1.0
 * @ClassName: Client
 * @Description: 客户端类:测试类
 */
public class Client {
    public static void main(String[] args) {
        Request req = null;
        Response res = null;

        FilterChain filterChain = new FilterChain();
        filterChain.addFilter(new FirstFilter()).addFilter(new SecondFilter());
        filterChain.doFilter(req, res);
    }
}

1.6 运行结果



以上是关于设计模式 行为型模式 -- 职责链模式(JDK源码分析:FilterChain(过滤器))的主要内容,如果未能解决你的问题,请参考以下文章

行为型模式—职责链模式

设计模式-行为型-职责链模式

设计模式-行为型-职责链设计模式

行为型模式之职责链模式

18行为型模式之责任链模式

设计模式 行为型模式 -- 职责链模式(定义结构纯与不纯的职责链模具体案例)