设计模式-责任链设计
来源:互联网 发布:mysql 关闭外键约束 编辑:程序博客网 时间:2024/05/11 23:37
看了一下设计模式中的责任链设计模式,主要实现类似拦截器的功能,记下来方便自己以后复习。
1、应用场景
假设要处理爬虫趴下来的内容,你就需要发这些内容进行去噪,例如:取格式化html标签,去页面脚本,去敏感信息等等,如果将这些过滤内容都写在一个方法中,那么势必造成代码耦合性强,如果以后不断的添加内容,将造成很大的维护成本。
所以,我们需要把变化的内容抽取出来定义为接口,需要使用时我们只需实现其对应的操作。
2、实例应用
1、 内容去噪过滤
先定义过滤接口
package org.andy.filter;/** * 创建时间:2015-1-25 下午10:55:03 * * @author andy * @version 2.2 */public interface Filter {/** * 定义过滤器 * @return */public String doFilter(String src);}
定义几个过滤器,实现具体的过滤功能。
html内容过滤:
package org.andy.filter;/** * 创建时间:2015-1-25 下午10:56:41 * @author andy * @version 2.2 */public class HtmlFilter implements Filter {@Overridepublic String doFilter(String src) {// 实现过滤html内容return src.replace("<", "[").replace(">", "]"); }}
javascript脚本过滤:
package org.andy.filter;/** * 创建时间:2015-1-25 下午11:01:24 * @author andy * @version 2.2 */public class JavascriptFilter implements Filter {@Overridepublic String doFilter(String src) {// 实现过滤javascript脚本return src.replace("javascript", "js");}}
敏感内容过滤:
package org.andy.filter;/** * 创建时间:2015-1-25 下午11:09:00 * @author andy * @version 2.2 */public class SensitiveFilter implements Filter{@Overridepublic String doFilter(String src) {// 处理敏感内容return src.replace("逗叉", "**");}}
定义责任链,即过滤器链:
package org.andy.filter;import java.util.ArrayList;import java.util.List;/** * 创建时间:2015-1-25 下午11:14:58 * @author andy * @version 2.2 * 责任链 */public class FilterChain implements Filter {private List<Filter> filters = new ArrayList<Filter>();public FilterChain addFilter(Filter filter){this.filters.add(filter);//返回过滤器链return this;}@Overridepublic String doFilter(String src) {for (Filter filter : filters) {src = filter.doFilter(src);}return src;}}
测试内容过滤:
package org.andy.filter;/** * 创建时间:2015-1-25 下午11:12:49 * * @author andy * @version 2.2 */public class TestFilter {/** * @param args */public static void main(String[] args) {String src = "<html/> <javascript>alert('你是个逗叉');</javascript>";System.out.println(src);FilterChain chain = new FilterChain();chain.addFilter(new HtmlFilter()) .addFilter(new JavascriptFilter());System.out.println(chain.doFilter(src));FilterChain chain1 = new FilterChain();chain1.addFilter(new SensitiveFilter());System.out.println(chain1.doFilter(src)); chain.addFilter(chain1); System.out.println(chain.doFilter(src)); }}
2、实现web中filter的拦截
JavaEE中filter的拦截,当有request请求时,会先执行所有的request请求,在逐个进行response内容过滤响应。
定义request:
package org.andy.web.filter;/** * 创建时间:2015-1-25 下午11:47:06 * * @author andy * @version 2.2 */public class Request { String requestStr;}
定义response:
package org.andy.web.filter;/** * 创建时间:2015-1-25 下午11:48:09 * * @author andy * @version 2.2 */public class Response {String responseStr;}
定义拦截器接口:
package org.andy.web.filter;/** * 创建时间:2015-1-25 下午11:45:31 * * @author andy * @version 2.2 * Filter接口,响应request和 response的请求 */public interface Filter {public void doFilter(Request request, Response response, FilterChain chain);}
定义责任链:
package org.andy.web.filter;import java.util.ArrayList;import java.util.List;/** * 创建时间:2015-1-26 上午10:07:08 * * @author andy * @version 2.2 */public class FilterChain implements Filter {private List<Filter> filters = new ArrayList<Filter>();private int index;public FilterChain addFilter(Filter filter) {this.filters.add(filter);return this;}@Overridepublic void doFilter(Request request, Response response, FilterChain chain) {// TODO Auto-generated method stubif (index == filters.size())return;Filter filter = filters.get(index);index++;filter.doFilter(request, response, chain);}}
定义html拦截:
package org.andy.web.filter;/** * 创建时间:2015-1-25 下午10:56:41 * @author andy * @version 2.2 */public class HtmlFilter implements Filter{@Overridepublic void doFilter(Request request, Response response, FilterChain chain) {// 先执行request再执行responserequest.requestStr = request.requestStr.replace("<", "[").replace(">", "]") + "-----htmlFilterRequest";//执行下一个链的filterchain.doFilter(request, response, chain);response.responseStr += "-----htmlFilterResponse"; }}
定义javascript脚本过滤:
package org.andy.web.filter;/** * 创建时间:2015-1-25 下午11:01:24 * @author andy * @version 2.2 */public class JavascriptFilter implements Filter {@Overridepublic void doFilter(Request request, Response response, FilterChain chain) {// 先执行request再执行responserequest.requestStr = request.requestStr.replace("javascript", "js") + "-----javascriptFilterRequest";//执行下一个链的filterchain.doFilter(request, response, chain);response.responseStr += "-----javascriptFilterResponse";}}
拦截测试:
package org.andy.web.filter;/** * 创建时间:2015-1-26 上午11:10:11 * @author andy * @version 2.2 */public class TestFilter {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubString src = "<html/> <javascript>alert('你是个逗叉');</javascript>";System.out.println(src);Request request = new Request();request.requestStr = src;Response response = new Response();response.responseStr = "response";FilterChain chain = new FilterChain();chain.addFilter(new HtmlFilter()) .addFilter(new JavascriptFilter());chain.doFilter(request, response, chain);System.out.println(request.requestStr);System.out.println(response.responseStr);}}
0 0
- 责任链设计模式
- 责任链设计模式
- 设计模式---责任链
- 责任链设计模式
- 设计模式----责任链
- 设计模式-责任链
- 责任链设计模式
- 责任链设计模式
- 设计模式:责任链
- [设计]责任链模式
- 设计模式--责任链
- 责任链设计模式
- 设计模式-责任链设计
- 设计模式----责任链模式
- 【设计模式】责任链模式
- 设计模式---责任链模式
- 设计模式:责任链模式
- 设计模式--责任链模式
- 写一个简单的fragment的demo 时遇到的问题
- public, protect,friendly,private作用范围
- chromium DOM树形成浅析
- Java 用户资料完整度的前端显示(思路)
- UVA Mapping the Swaps (DFS)
- 设计模式-责任链设计
- 9.Spring_通过工厂方法配置Bean
- MySQL数据对比
- css 固定悬浮
- wsgiref+Paste Deployment的使用
- Hive几种数据导出方式
- Unity3D读取XML文档信息实例
- 百炼OJ 2973:Skew数
- Dll嵌套调用