责任链模式

责任链,如同名字一样,一条链子,是有一环套一环的,没一个环就相当于一个处理器,处理完后交给下一个处理器处理,只到所有的处理器都处理完,如果我们有过web开发经验的人,看到这个比如就会联想到Filter和interceptor这两个概念,就是过滤器和拦截器,现在我们将模拟过滤器来讲解责任模式,

1、写一个Filter接口(这个接口是我自定义的,并非Servlet中的那个Filter)

public interface Filter
{
	public void doFilter(Request request,Response response,FilterChain chain);
}


2、写一个Request,Response类,分别模式web编程总的两个类,相信你懂 的!

public class Request
{
	//定义一个简单的字符串
	private String requestStr;

	public String getRequestStr()
	{
		return requestStr;
	}

	public void setRequestStr(String requestStr)
	{
		this.requestStr = requestStr;
	}
	
}

public class Response
{
	private String responseStr;

	public String getResponseStr()
	{
		return responseStr;
	}

	public void setResponseStr(String responseStr)
	{
		this.responseStr = responseStr;
	}
}


3、编写一个处理"<>"的Filter,将内容的"<>"变为"[]",一个处理敏感信息的Filter

public class HtmlFilter implements Filter
{
	@Override
	public void doFilter(Request request, Response response, FilterChain chain)
	{
		// TODO Auto-generated method stub
		//将Request中的字符串中的<>变为[]
		request.setRequestStr(request.getRequestStr().replace(">", "]"));
		request.setRequestStr(request.getRequestStr().replace("<", "["));
		//标记一个被这个Filter处理过
		request.setRequestStr(request.getRequestStr()+"---html");
		chain.doFilter(request, response, chain);
		//将Response中的字符串中的<>变为[]
		response.setResponseStr(response.getResponseStr().replace("<", "["));
		response.setResponseStr(response.getResponseStr().replace(">", "]"));
		//同上
		response.setResponseStr(response.getResponseStr()+"---html");
	}

}
public class SenFilter implements Filter
{

	@Override
	public void doFilter(Request request, Response response, FilterChain chain)
	{
		// TODO Auto-generated method stub
		request.getRequestStr().replace("敏感", "^V^");
		request.setRequestStr(request.getRequestStr()+"--sen");
		chain.doFilter(request, response, chain);
		response.getResponseStr().replace("敏感", "^V^");
		response.setResponseStr(response.getResponseStr()+"--sen");
	}

}



4、编写一个链子,里面保存所有的Filter,并自身实现了Filter接口

public class FilterChain implements Filter
{

	private List<Filter> filters=new ArrayList<Filter>();
	private int now=-1;
	@Override
	public void doFilter(Request request, Response response, FilterChain chain)
	{
		// TODO Auto-generated method stub
		now++;
		if(now<=filters.size()-1)
			filters.get(now).doFilter(request, response, chain);
		else 
			return;
		
	}
	//增加Filter
	public void addFilter(Filter filter)
	{
		filters.add(filter);
	}
	//删除Filter
	public void removeFilter(Filter filter)
	{
		filters.remove(filter);
	}

}


5、测试

public class Test
{
	public static void main(String[] args)
	{
		FilterChain chain=new FilterChain();
		chain.addFilter(new HtmlFilter());
		chain.addFilter(new SenFilter());
		
		String str1="<Hello>,你是谁?怎么到我房间里面来了?";
		String str2="<haha>,我是小偷";
		
		Request request=new Request();
		request.setRequestStr(str1);
		
		Response response=new Response();
		response.setResponseStr(str2);
		
		chain.doFilter(request, response, chain);
		System.out.println(request.getRequestStr());
		System.out.println(response.getResponseStr());
	}
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值