java设计模式(二):2.3责任链(返回链)

来源:互联网 发布:英雄382美工钢笔 编辑:程序博客网 时间:2024/05/24 00:07

例子:模拟实现java web过滤器

工程目录结构与执行原理:

1.Request.java请求类

package web;public class Request {private String requestStr;public String getRequestStr() {return requestStr;}public void setRequestStr(String requestStr) {this.requestStr = requestStr;}}

 

2.Response.java响应类

package web;public class Response {private String responseStr;public String getResponseStr() {return responseStr;}public void setResponseStr(String responseStr) {this.responseStr = responseStr;}}

 

3.Filter.java过滤器接口类

package filter;import web.Request;import web.Response;public interface Filter {public void doFilter(Request request,Response response,FilterChain chain);}

 

4.Filter1.java过滤器实现类

package filter.impl;import web.Request;import web.Response;import filter.Filter;import filter.FilterChain;public class Filter1 implements Filter{@Overridepublic void doFilter(Request request,Response response,FilterChain chain) {request.setRequestStr(request.getRequestStr() + ",request-doFilter1");chain.doFilter(request, response, chain);response.setResponseStr(response.getResponseStr() + ",response-doFilter1");}}

 

5.Filter2.java过滤器实现类

package filter.impl;import web.Request;import web.Response;import filter.Filter;import filter.FilterChain;public class Filter2 implements Filter{@Overridepublic void doFilter(Request request,Response response,FilterChain chain) {request.setRequestStr(request.getRequestStr() + ",request-doFilter2");chain.doFilter(request, response, chain);response.setResponseStr(response.getResponseStr() + ",response-doFilter2");}}

 

6.FilterChain.java过滤器链条类

package filter;import java.util.ArrayList;import java.util.List;import web.Request;import web.Response;public class FilterChain implements Filter{List<Filter> filters = new ArrayList<Filter>();int index = 0;public FilterChain addFilter(Filter filter){filters.add(filter);return this;}public void doFilter(Request request,Response response,FilterChain chain){if(index == filters.size())return;Filter f = filters.get(index);index++;f.doFilter(request, response, chain);}}


7.Main.java程序主方法

import web.Request;import web.Response;import filter.FilterChain;import filter.impl.*;public class Main {public static void main(String[] args) {Request request = new Request();request.setRequestStr("Request:");Response response = new Response();response.setResponseStr("Response:");FilterChain fc = new FilterChain();fc.addFilter(new Filter1())  .addFilter(new Filter2());fc.doFilter(request,response,fc);System.out.println(request.getRequestStr());System.out.println(response.getResponseStr());}}

程序打印结果:

Request:,request-doFilter1,request-doFilter2
Response:,response-doFilter2,response-doFilter1