责任链模式(Java)

618 阅读1分钟
原文链接: github.com

tomcat中的Filter实现


// 责任链的调度器
public interface FilterChain {

	public void initFilters(List<Filter> filters);

	public void doFilter (Object params);
	

}


// 过滤器 责任链上的一个零件
public interface Filter {
	
	public void doFilter (Object params , FilterChain filterChain);

}


public class DefaultFilterChain implements {

	private List<Filter> filters;
	private Iterator<Filter> iterator;

	public void initFilters(List<Filter> filters) {

		// 这里可以对 filter 进行排序, 通过Ordered 接口排序
		this.filters = filters ;
		iterator = filters.iterator;
	}

	public void doFilter (Object params) {
		// 这里可以进行判空操作
		if (iterator.hasNext()) {
			iterator.next().doFilter(params , this);
		}

	}
	



}



具体过滤器 1. 2. 3. 测试用

/**
 * Created by zhuangjiesen on 2017/10/26.
 */
public class CommonFilter1 implements Filter {
    @Override
    public void doFilter(Object params, FilterChain filterChain) {

        System.out.println("i am CommonFilter1 doFilter ....");

        filterChain.doFilter(params);

    }
}



/**
 * Created by zhuangjiesen on 2017/10/26.
 */
public class CommonFilter2 implements Filter {
    @Override
    public void doFilter(Object params, FilterChain filterChain) {
        System.out.println("i am CommonFilter2 doFilter ....");

    }
}



/**
 * Created by zhuangjiesen on 2017/10/26.
 */
public class CommonFilter3 implements Filter {
    @Override
    public void doFilter(Object params, FilterChain filterChain) {
        System.out.println("i am CommonFilter3 doFilter ....");

    }
}


调用 filterChain.doFilter(params); 责任链才能继续工作

调用示例:

/**
 * Created by zhuangjiesen on 2017/10/25.
 */
public class DesignTest {


    public static void main(String[] args) {

        System.out.println("设计模式...");


        FilterChain filterChain = new DefaultFilterChain();

        List<Filter> filters = new ArrayList<>();
        filters.add(new CommonFilter1());
        filters.add(new CommonFilter2());
        filters.add(new CommonFilter3());
		// 初始化
        filterChain.initFilters(filters);
        // 调用过滤器
        filterChain.doFilter("zhuangjiesen");

    }


}


// 责任链模式就是你只要实现 Filter 接口加入到队列中
如果需要下滤,可以调用 filterChain.doFilter(params); 
如果不需要下滤, 不调用就可以,就停在当前过滤器中