java设计模式--责任链(三)

问题:java设计模式--责任链(二)中的责任链结构还不够完美,在实际的应用中,消息在从客户端发到服务端时需要过滤,在返回时也需要被过滤,如下图所示:


这正是java web的interceptor的功能。

先写两个类,一个Request,一个Response,如下:

package chanOfResponsibility;

public class Request {
	private String requestStr;

	public String getRequestStr() {
		return requestStr;
	}

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

package chanOfResponsibility;

public class Response {
	private String responseStr;

	public String getResponseStr() {
		return responseStr;
	}

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

修改Filter的doFilter方法,将参数调整为Request的对象以及Response的对象

package chanOfResponsibility;

public interface Filter {
	public String doFilter(Request request,Response response);
}

之前实现Filter的三个类FilterChain,SymbolFilter,CharacterFilter分别修改成如下:

package chanOfResponsibility;

import java.util.ArrayList;
import java.util.List;

public class FilterChain implements Filter{

	private List<Filter> filters = new ArrayList<Filter>();
	@Override
	public void doFilter(Request request,Response response) {
		for(Filter f : filters){
			f.doFilter(request,response);
		}
	}
	
	public FilterChain addFilter(Filter f){
		filters.add(f);
		return this;
	}
}

package chanOfResponsibility;

public class SymbolFilter implements Filter{

	@Override
	public void doFilter(Request request,Response response) {
		String msg = request.getRequestStr();
		msg = msg.replaceAll("。", ";");
		request.setRequestStr(msg);
	}
}

package chanOfResponsibility;

public class CharacterFilter implements Filter{

	@Override
	public void doFilter(Request request,Response response) {
		String msg = request.getRequestStr();
		msg = msg.replaceAll("多", "*");
		request.setRequestStr(msg);
	}

}

Main :

package chanOfResponsibility;

public class Main {
	public static void main(String[] args) {
		String msg = "java知识点好多,需要花好多时间精力去学。好像出去旅游。";
		Request request = new Request();
		request.setRequestStr(msg);
		Response response = new Response();
		response.setResponseStr("response");
		//过滤链
		FilterChain filterChain = new FilterChain();
		filterChain.addFilter(new SymbolFilter()).addFilter(new CharacterFilter());
		filterChain.doFilter(request, response);
		System.out.println(request.getRequestStr());
		System.out.println(response.getResponseStr());
	}
}

当前,我只是对request的数据做了处理,并没有对response做任何的处理。如果我在SymbolFilter或者CharacterFilter的doFilter方法中,在处理request的参数之后立即处理response的参数,这会使得request与response经历Filter的顺序是一样的,其实它俩经历Filter的顺序应该是反过来的。这要怎么做呢?

处理的思路:在请求经历Filter时只对Request做处理,处理完了之后立即调用下一个Filter的doFilter方法,等这个方法返回之后再对Response做处理。当前的Filter如何知道下一个Filter是谁呢,那就需要通过FilterChain来做呢。

根据这个思路,现将Filter修改为如下:

package chanOfResponsibility;

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

之前实现SymbolFilter,CharacterFilter分别修改成如下:

package chanOfResponsibility;

public class SymbolFilter implements Filter{

	@Override
	public void doFilter(Request request,Response response,FilterChain chain) {
		String msg = request.getRequestStr();
		msg = msg.replaceAll("。", ";");
		request.setRequestStr(msg);
		chain.doFilter(request, response, chain);
		
		String responseMsg = response.getResponseStr();
		response.setResponseStr(responseMsg + "-----SymbolFilter---");
	}
}

package chanOfResponsibility;

public class CharacterFilter implements Filter{

	@Override
	public void doFilter(Request request,Response response,FilterChain chain) {
		String msg = request.getRequestStr();
		msg = msg.replaceAll("多", "*");
		request.setRequestStr(msg);
		chain.doFilter(request, response, chain);
		
		String responseMsg = response.getResponseStr();
		response.setResponseStr(responseMsg + "-----CharacterFilter---");
	}

}

现在FilterChain则需要作为中转站,来调用下一个Filter,现将其修改为:

package chanOfResponsibility;

import java.util.ArrayList;
import java.util.List;

public class FilterChain implements Filter{

	private List<Filter> filters = new ArrayList<Filter>();
	
	private int index = 0;
	
	@Override
	public void doFilter(Request request,Response response,FilterChain chain) {
		if(index == filters.size()){
			return;
		}
		Filter f = filters.get(index);
		index ++ ;
		f.doFilter(request, response, chain);
	}
	
	public FilterChain addFilter(Filter f){
		filters.add(f);
		return this;
	}
}

Main:

package chanOfResponsibility;

public class Main {
	public static void main(String[] args) {
		String msg = "java知识点好多,需要花好多时间精力去学。好像出去旅游。";
		Request request = new Request();
		request.setRequestStr(msg);
		Response response = new Response();
		response.setResponseStr("response");
		//过滤链
		FilterChain filterChain = new FilterChain();
		filterChain.addFilter(new SymbolFilter()).addFilter(new CharacterFilter());
		filterChain.doFilter(request, response,filterChain);
		System.out.println(request.getRequestStr());
		System.out.println(response.getResponseStr());
	}
}

运行结果:


现在request是先用SymbolFilter,再用CharacterFilter,response是先用CharacterFilter,再用CharacterFilter。

处理过程如下图


FilterChain只负责调用下一个Filter的doFilter方法。

以上代码有点类似于java.servlet中的Filter与FilterChain。

以上就是个人对于责任链的理解,如有错误,欢迎指正,谢谢!!

猜你喜欢

转载自blog.csdn.net/qq_38317491/article/details/78872378