码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式-责任链设计

时间:2015-01-26 19:24:08      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:设计模式   责任链模式   filter   过滤器   

看了一下设计模式中的责任链设计模式,主要实现类似拦截器的功能,记下来方便自己以后复习。

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 {

	@Override
	public 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 {

	@Override
	public 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{

	@Override
	public 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;
	}
	
	@Override
	public 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;
	}

	@Override
	public void doFilter(Request request, Response response, FilterChain chain) {
		// TODO Auto-generated method stub

		if (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{

	@Override
	public void doFilter(Request request, Response response, FilterChain chain) {
		// 先执行request再执行response
		request.requestStr = request.requestStr.replace("<", "[").replace(">", "]") + "-----htmlFilterRequest";
		//执行下一个链的filter
		chain.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 {

	@Override
	public void doFilter(Request request, Response response, FilterChain chain) {
		// 先执行request再执行response
		request.requestStr = request.requestStr.replace("javascript", "js") + "-----javascriptFilterRequest";
		//执行下一个链的filter
		chain.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 stub
		String 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);
		
	}

}



   







设计模式-责任链设计

标签:设计模式   责任链模式   filter   过滤器   

原文地址:http://blog.csdn.net/fengshizty/article/details/43154075

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!