`
lisa.zhou
  • 浏览: 3734 次
  • 性别: Icon_minigender_2
最近访客 更多访客>>
社区版块
存档分类
最新评论

设计模式之责任链

 
阅读更多
  1. Chain  of responsibility.是一种比较简单的设计模式。个人理解,Servlet的filter和struts中的Interceptor都会采用这种模式。
  2. 以filter为例,filterChain将filter的各个过滤步骤封装成了黑盒子,用户只需将request和response放进去,利用filterChain逐步进行过滤,拿到最终结果。
  3. 以下是是一个例子,模拟Filter的执行步骤:其中request依次经过SpecialCharacterFilter和SensitiveWordsFilter的过滤,返回的response依次经过SensitiveWordsFilter和SpecialCharacterFilter的过滤。
  • 定义Filter接口,这里定义过滤规则
    public interface Filter {
    public void doFilter(Request request,Response response,FilterChain chain);
    }
     
  • 定义分别定义Request和Response两个实体类,每个类中各有一个静态变量:requestStr和responseStr
  • 分别定义SpecialCharacterFilter和SensitiveWordsFilter实现Filter接口,并实现doFilter()
    public class SpecialCharacterFilter implements Filter {
    	
    	/*
    	 * replace the '<' to '[', '>' to ']'
    	 * @see com.lisa.dp.filter.Filter#doFilter(java.lang.String)
    	 */
    	@Override
    	public void doFilter(Request request, Response response,FilterChain chain) {
    		String returnStr = null;
    		if(request.requestStr!= null){
    			request.requestStr = request.requestStr.replace('<', '[').replace('>', ']');
    		}
    		chain.doFilter(request, response,chain);
    		response.responseStr = response.responseStr +"-> SpecialCharacterFilter";
    	}
    } 
    public class SensitiveWordsFilter implements Filter {	
    	/*
    	 * delete the sensitive words
    	 * @see com.lisa.dp.filter.Filter#doFilter(java.lang.String)
    	 */
    	@Override
    	public void doFilter(Request request, Response response,FilterChain chain) {
    		if(request.requestStr != null){
    			request.requestStr = request.requestStr.replace("敏感","");
    		}
    		chain.doFilter(request, response,chain);
    		response.responseStr = response.responseStr +"-> SensitiveWordsFilter";
    	}
    
    }
     注意在这里,除了对request信息做完过滤后,交给chain继续执行,待对request操作完之后,便可实现倒序对response进行过滤
  • 那么,这里还有一个FilterChain类,该类同时实现Filter接口,在该类中对Filter chain中的filter进行管理,实际操作filter类
    public class FilterChain implements Filter{
    	List<Filter> filters = new ArrayList<Filter>();
    	
    
    	private int index;
    	
    	public FilterChain addFilter(Filter f){
    		this.filters.add(f);
    		return this;
    	}
    	@Override
    	public void doFilter(Request request, Response response,FilterChain chain) {
    		if(index == filters.size()){
    			return;
    		}else{
    			Filter filter = filters.get(index);
    			index ++;
    			filter.doFilter(request, response, chain);
    		}
    	}
    }
  •  最后new Main类,进行测试
    public class Main {
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		String filterMsg = new String("大家好:)<script>,敏感,被就业!");
    		Request req = new Request();
    		req.setRequestStr(filterMsg);
    		Response response = new Response();
    		response.setResponseStr("response");
    		FilterChain fc = new FilterChain();
    		fc.addFilter(new SpecialCharacterFilter()).addFilter(new SensitiveWordsFilter());//add filter to filter chain
    		fc.doFilter(req, response,fc);//filter chain manage and execute the filters
    		System.out.println("after chain filter: request string = "+req.requestStr);//the final request result
    		System.out.println("after chain filter: response string = "+response.responseStr);//the final response result
    	}
    
    }
       执行结果:
    after chain filter: request string = 大家好:)[script],,被就业!
    after chain filter: response string = response-> SensitiveWordsFilter-> SpecialCharacterFilter
     可以发现,对fiterMsg依次进行了特殊字符过滤和敏感文字过滤。之后对返回的response进行了敏感文字和特殊字符过滤。
  • 大小: 13.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics