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);}}
持有Msg和FilterChain的引用让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());}}
- java设计模式之责任链模式
- java设计模式之责任链模式
- Java 设计模式之责任链模式
- Java设计模式之责任链模式
- 《Java设计模式》之责任链模式
- 《Java设计模式 》之责任链模式
- JAVA设计模式之:责任链模式
- java设计模式之责任链模式
- java设计模式之责任链模式
- Java设计模式之责任链模式
- java设计模式之责任链模式
- 《java设计模式》之责任链模式
- java设计模式之责任链模式
- Java设计模式之责任链模式
- java设计模式之责任链模式
- Java设计模式之责任链模式
- JAVA设计模式之责任链模式
- java设计模式之责任链模式
- centos 安装 C#开发环境 mono
- centos和redhat6.0后关于虚拟机克隆后无法启用网卡问题
- 分布式系统编程,你到哪一级了?
- WINFORM 中获得目录
- pku 2104划分树
- java设计模式之责任链
- Win7 开启 局域网 匿名访问共享
- 杂记
- 后缀数组
- [二分匹配]poj 1719 Shooting Contest
- 回文的方法
- hdu4259 Double Dealing----置换群
- Android ApiDemos示例解析(140):Views->Layouts->Baseline->Nested Example 3
- 老板的忠告