java设计模式之责任链

来源:互联网 发布:2017淘宝搜索规则变化 编辑:程序博客网 时间:2024/05/22 04:03

责任链

责任链模式(Chain of Responsibility)是Web项目中最经常用到的一个设计模式,比如是Apache Tomcat 的对Encoding的 处理,Struts2 的拦截器, jsp servlet 的Filter 等等,都是基于责任链模式设计的。比如有一个作业任务,先有一个对象对其负责处理,之后又交给其他的一个对象处理,一次传递下去,这是最通俗最简单的责任链模式的应用。但是责任链模式不仅仅的的就局限于这一种的最简单的应用,比如通信领域的短信验证码的获取,请求验证码---->发送验证码-----> 处理验证码----->提交验证码----->得到结果 等等的应用都和责任链模式密布可分。不一定非要在设计中就是用设计模式,但是联系联系周围的环境,思考思考周边的应用,自然的规律的轮回,都都感觉和设计模式有瓜葛。

 现在就模拟对网站信息处理的字符处理展示下什么是责任链模式:

首先给出一个Filter接口:

public interface Filter {String doFilter(String str);}

接着下面是三个实现了Filter接口的类:

FaceFilter代码如下:

public class FaceFilter implements Filter {public String doFilter(String str) {return str.replace(":)", "^V^");}}

HTMLFilter代码如下

public class HTMLFilter implements Filter {public String doFilter(String str) {//process the html tag <>String r = str.replace('<', '[')   .replace('>', ']');return r;}}

SesitiveFilter代码如下:

public class SesitiveFilter implements Filter {public String doFilter(String str) {//process the sensitive wordsString r = str.replace("被就业", "就业") .replace("敏感", "");return r;}}

上面这三个类的作用是对一个Message进行过滤。下面将这些Filter像链条一样串起来如下图:



类FilterChain给出了具体实现:

public class FilterChain implements Filter {List<Filter> filters = new ArrayList<Filter>();public FilterChain addFilter(Filter f) {this.filters.add(f);return this;}public String doFilter(String str) {String r = str;for(Filter f: filters) {r = f.doFilter(r);}return r;}}

MsgProcessor类代码如下:

public class MsgProcessor {private String msg;//Filter[] filters = {new HTMLFilter(), new SesitiveFilter(), new FaceFilter()};FilterChain fc;public FilterChain getFc() {return fc;}public void setFc(FilterChain fc) {this.fc = fc;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public String process() {return fc.doFilter(msg);}}

持有MsgFilterChain的引用让FilterChain通过具体的Filter来对Msg进行处理。


给出一个实例类Main代码如下:

public class Main {/** * @param args */public static void main(String[] args) {String msg = "大家好:),<script>,敏感,被就业,网络授课没感觉,因为看不见大家伙儿";MsgProcessor mp = new MsgProcessor();mp.setMsg(msg);FilterChain fc = new FilterChain();fc.addFilter(new HTMLFilter())  .addFilter(new SesitiveFilter())  ;FilterChain fc2 = new FilterChain();fc2.addFilter(new FaceFilter());fc.addFilter(fc2);mp.setFc(fc);String result = mp.process();System.out.println(result);}}

这样一个简单的责任链就实现。但是随着学习的深入又有一个新的问题摆在我们面前,如果我想像servlet里面那样既能对Request进行处理也可以对Response进行处理呢?

下面给出相对应上面的几个类:

首先给出一个Filter接口:

public interface Filter { void doFilter(Request request,Response response,FilterChain chain);}

接着下面是三个实现了Filter接口的类:

FaceFilter代码如下:

public class FaceFilter implements Filter {public void doFilter(Request request, Response response, FilterChain chain) {request.requestStr = request.requestStr.replace(":)", "^V^")+ "---FaceFilterRequest";chain.doFilter(request, response, chain);response.responseStr += "---FaceFilterResponse"; }}

HTMLFilter代码如下:

public class HTMLFilter implements Filter {public void doFilter(Request request, Response response, FilterChain chain) {request.requestStr = request.requestStr.replace('<', '[').replace('>', ']')+ "---HTMLFilterRequest";chain.doFilter(request, response, chain);response.responseStr += "---HTMLFilterResponse"; }}

SesitiveFilter代码如下:

public class SesitiveFilter implements Filter {public void doFilter(Request request, Response response, FilterChain chain) {request.requestStr = request.requestStr.replace('<', '[')   .replace('>', ']')+ "---SesitiveFilterRequest";chain.doFilter(request, response, chain);response.responseStr += "---SesitiveFilterResponse"; }}

FilterChain给出了具体实现:

public class FilterChain implements Filter {List<Filter> filters = new ArrayList<Filter>();int index = 0;public FilterChain addFilter(Filter f) {this.filters.add(f);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);}}

给出一个实例类Main代码如下:

public class Main {/** * @param args */public static void main(String[] args) {String msg = "大家好:),<script>,敏感,被就业,网络授课没感觉,因为看不见大家伙儿";Request request = new Request();request.setRequestStr(msg);Response response = new Response();response.setResponseStr("response");FilterChain fc = new FilterChain();fc.addFilter(new HTMLFilter())  .addFilter(new SesitiveFilter());fc.doFilter(request, response, fc);System.out.println(request.getRequestStr());System.out.println(response.getResponseStr());}}