Chain of Responsibility(责任链模式)

来源:互联网 发布:2016中国近几年gdp数据 编辑:程序博客网 时间:2024/05/20 07:33
一,概述

责任链模式在tomcat里面的Filter和Struts里面的Interceptor都用到了这一模式,此模式的目标是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

二,实现责任链模式实例代码,在以下实例代码中FilterChian类里面的addFilter和doFilter方法是实现这模式的关键,请认真领会。

(1)Request类

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


 

(2)Response类

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


 

(3)Filter接口

package com.sihang.cor;public interface Filter {public void doFilter(Request request,Response response,FilterChain chain);}


(4)FilterChain类,实现Filter接口

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


(5)多个自己定义的Filter

package com.sihang.cor;public class HtmlFilter implements Filter {@Overridepublic void doFilter(Request request, Response response, FilterChain chain) {request.setRequestStr(request.getRequestStr().replace("Html_start", "XML_start"));chain.doFilter(request, response, chain);response.setResponseStr(response.getResponseStr().replace("Html_end", "XML_end"));}}


 

package com.sihang.cor;public class JSFilter implements Filter {@Overridepublic void doFilter(Request request, Response response, FilterChain chain) {request.setRequestStr(request.getRequestStr().replace("javascript_start","TXT_start"));chain.doFilter(request, response, chain);response.setResponseStr(response.getResponseStr().replace("javascript_end", "TXT_end"));}}


 

package com.sihang.cor;public class SensitiveFilter implements Filter{@Overridepublic void doFilter(Request request, Response response, FilterChain chain) {request.setRequestStr(request.getRequestStr().replace("sensitive_start", "harmonious_start"));chain.doFilter(request, response, chain);response.setResponseStr(response.getResponseStr().replace("sensitive_end", "harmonious_end"));}}


 

 

package com.sihang.cor;public class MainTest {public static void main(String[]args){Request request = new Request();request.setRequestStr("javascript_start---Html_start----sensitive_start");Response response = new Response();response.setResponseStr("javascript_end----Html_end----sensitive_end");FilterChain chain = new FilterChain();chain.addFilter(new HtmlFilter());chain.addFilter(new SensitiveFilter());chain.addFilter(new JSFilter());chain.doFilter(request, response, chain);System.out.println(request.getRequestStr());System.out.println(response.getResponseStr());}}


原创粉丝点击