设计模式-责任链设计

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

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);

	}

}
时间: 2024-12-23 04:09:38

设计模式-责任链设计的相关文章

[设计模式] 责任链模式之变种 - 责任链子

今天看到 wikipedia 的责任链模式,好奇之下搜寻相关文章,此文章主要参考 91大的 [.NET]重构之路系列v11 –用责任链模式打破讨厌的switch case 的变种作法,所以跟原本的责任链模式的设计思路不太相同,但结果相同, 所以阅读前,建议先看完91大的文章后,在来看这篇会比较能感觉出差异. ?这边先引用91大文章结尾结论中的补充来复习一下责任链的重点, 20120415 补充:责任链的用意在于把每个角色的职责分清楚,每个对象只需要做好自己的事,透过责任链的方式来组合,并完成使用

设计模式--责任链

Mark:关于责任链Demo. 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 类图: 请假--审批(转) 描述: 请假这个事情,相信每个人都不陌生. 我们公司是个相对很宽松的公司. 在公司里,如果你的请假时间小于0.5天,那么只需要向项目经理打声招呼就OK了. 如果超过了0.5天,但是还小于2天,那么就要去找人事部处理,当然,这就要扣工资了. 如果超过了2天,你就需要去找总经理了,工资

java 设计模式 -- 责任链模式

设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪个对象处理,这使得我们能够动态的添加链上的对象而且分配责任. 纯责任链和非纯责任链 责任链分为两种.纯责任链和非纯责任链. 纯责任链是待处理对象request在处理对象handler链上传递,每一个处理对象handler处理request的一部分,到终于处理完毕.非纯责任链则是待处理对象reques

设计模式——责任链(chain of responsibiltiy)

责任链模式在面向对象程式设计里是一种软件设计模式,它包含了一些命令对象和一系列的处理对象. 每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象.也就是说责任链决定了任务的处理上方和下方. 该模式还描述了往该处理链的末尾添加新的处理对象的方法.<wiki> 1:建立一个filte接口,用来处理客户度发送给服务器端,以及服务器端返回给客户端的消息. 1 public interface Filter { 2 void doFilter(Reque

24天学会设计模式------责任链模式

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka/article/details/43210027 一.责任链模式(Chain of Responsibility Pattern) 1.简介 从名字上大概也能猜出这个模式的大概模样--系统中将会存在多个有类似处理能力的对象.当一个请求触发后,请求将在这些对象组成的链条中传递,直到找到最合适的"责任"对象,并进行处理.<设计模式>中给它的定义如下:使多个对象都有机会处理请

编程内功修炼之设计模式—责任链模式

在设计模式不清楚的情况下,学习各种框架不仅难学懂,也难理解,即使理解也不够深刻. 为了走更远的路,从基础抓起,每天坚持前进一小步! 虽然即将毕业,虽然路途很远,没有梦想何必远方! package edu.designpattern.chainofresponsibility; import java.util.ArrayList; import java.util.List; import org.junit.Test; /** * 责任链设计模式 * 模型练习 * * @author heli

设计模式-责任链模式

1 模式动机 为了降低系统的耦合度,将事件请求者和接收者解耦,我们可以使用命令模式来设计系统.通过增加不同的命令对象,不仅可以解耦,也可以有效解决发送和接收处理速度不一样的问题. 2 模式定义 责任链模式(Chain of Responsibility Pattern):将多个对象连成一条链,沿着这条链传递请求,直到有一个对象处理它为止,使得多个对象都有机会处理该请求. 3 模式分析 Handler处理者接口: 声明处理请求的接口. ConcreteHandler具体处理者类: 实现处理请求的接

Java与设计模式-责任链模式

责任链模式属于行为型设计模式之一,怎么理解责任链?责任链是可以理解成数个对象首尾连接而成,每一个节点就是一个对象,每个对象对应不同的处理逻辑,直至有一个对象响应处理请求结束.这一种模式成为责任链模式. 生活中可以找到责任链模式的原型吗?这种例子很多,比如你要去买房子,首先是销售人员(对象1)接待你,你说想要百分之3的折扣,没问题,这时销售人员就有打百分之三折扣的权限,销售人员(对象1)进行处理.这时来了一个土豪,说要买10套,要百分之五的折扣,销售人员(对象1)没有百分之五折扣的权限,必须要想上

iOS设计模式--责任链模式

何为责任链模式? 责任链模式的主要思想是,对象引用了同一类型的另一个对象,形成一条链.链中的每个对象实现了同样的方法,处理对链中第一个对象发起的同一个请求.如果一个对象不知道如何处理请求,它就把请求传递给下一个响应者. 责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间发生耦合.此模式将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 何时使用责任链模式? @:有多个对象可以处理请求,而处理程序只有在运行时才能确定. @:向一组对象发出请求,而不想显示指