问题: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。
以上就是个人对于责任链的理解,如有错误,欢迎指正,谢谢!!