模拟拦截器工作原理,加深对责任链模式的理解
Request.java
public class Request {
String RequestParams=””;
}
Response.java
public class Response {
String responseParams = “”;
}
定义拦截器的核心类Interceptor接口与RealInterceptorChain
Interceptor接口
Interceptor.java
public interface Interceptor {
Response intercept(Chain chain);
interface Chain {
Request request();
Response proceed(Request request);
}
}
RealInterceptorChain.java
public class RealInterceptorChain implements Interceptor.Chain {
private final List<Interceptor> interceptors;
private final int index;
private final Request request;
public RealInterceptorChain(List<Interceptor> interceptors, int index, Request request) {
this.interceptors = interceptors;
this.index = index;
this.request = request;
}
@Override
public Request request() {
return request;
}
@Override
public Response proceed(Request request) {
if (index >= interceptors.size()) throw new AssertionError();
RealInterceptorChain next = new RealInterceptorChain(interceptors, index + 1, request);
Interceptor interceptor = interceptors.get(index);
Response response = interceptor.intercept(next);
return response;
}
}
接下来定义几个拦截器
AInterceptor.java
public class AInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) {
Request request = chain.request();
request.RequestParams = request.RequestParams + "Arequest_";
Response response = chain.proceed(request);
response.responseParams = response.responseParams + "A_response";
System.out.println("A请求结果:" + response.responseParams);
return response;
}
}
BInterceptor.java
public class BInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) {
Request request = chain.request();
request.RequestParams = request.RequestParams + "Brequest_";
Response response = chain.proceed(request);
response.responseParams = response.responseParams + "B_response";
System.out.println("B请求结果:" + response.responseParams);
return response;
}
}
CallServerInterceptor.java
public class CallServerInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) {
RealInterceptorChain realChain = (RealInterceptorChain) chain;
Request request = realChain.request();
System.out.println("最终的请求参数:" + request.RequestParams);
//模拟获取response
Response response = new Response();
response.responseParams = "我是服务器的结果返回_";
System.out.println("服务器的请求结果:" + response.responseParams);
return response;
}
}
测试
public class TestDemo {
public static void main(String[] args) throws Exception {
List<Interceptor> interceptors = new ArrayList<>();
interceptors.add(new AInterceptor());
interceptors.add(new BInterceptor());
interceptors.add(new CallServerInterceptor());
Interceptor.Chain chain = new RealInterceptorChain(interceptors,0,null);
Request originalRequest = new Request();
originalRequest.RequestParams="requestInit_";
chain.proceed(originalRequest);
}
}
测试结果:
最终的请求参数:requestInit_Arequest_Brequest_
服务器的请求结果:我是服务器的结果返回_
B请求结果:我是服务器的结果返回_B_response
A请求结果:我是服务器的结果返回_B_responseA_response
可以发现通过责任链模式完成了request的拦截 和response的拦截