okhttp和责任链模式
2019-10-17 本文已影响0人
勇敢地追
OkHttp—拦截器这篇文章讲了拦截器,今天就谈谈责任链模式
责任链模式,其实就是把request通过一系列Interceptor过滤,然后通过网络请求获取response,然后再通过Interceptor过滤(方向和request相反)获取最终用户所需要的response
我们可以用责任链模式设计一个请假条审批(小于3天的由直接领导处理,大于3天就是大领导处理)
首先,我们需要定义我们的request和response
public class Request {
int day = 0;//请假天数
}
public class Response {
boolean isAgreed = false;//领导是否同意
}
接下来就需要定义处理请假请求的人物的接口
public interface Character {
Response processRequest(Chain chain);
}
暂时先不管具体实现,放到后面讲更好
接下来就是责任链的核心之处
一般的实现方法都是处理的Request和Response,但是责任链模式处理的是链,同时可以让这个链能够关联相应的Request和Response
//责任链模式的核心---为整个链提供接口,链上必须要有Request和Response
public interface Chain {
Request getRequest();
Response processChain();//选择用哪个链去解决相关内容
}
接下来就是Chain的具体实现
public class RealChain implements Chain {
private List<Character> list;
private Request request;
private int index = 0;
public RealChain(List<Character> list, Request request, int index) {
this.list = list;
this.request = request;
this.index = index;
}
@Override
public Request getRequest() {
return request;
}
@Override
public Response processChain() {
RealChain next = new RealChain(list, request, index + 1);
Response response = list.get(index).processRequest(next);
//这里不能简单的用index++来更新,不然的话当day>3的时候,会在FirstBoss里面无限循环
return response;
}
}
记下来就可以展示Character的具体实现了
//直接领导<=3才能通过,>3要给大领导处理
public class FirstBoss implements Character {
@Override
public Response processRequest(Chain chain) {
Request request = chain.getRequest();
Response response = new Response();
if(request.day <= 3) {
response.isAgreed = true;
System.out.println("FirstBoss Agreed");
} else {
//正式请求中,往SecondBoss传之前可以处理Header里面的信息
response = chain.processChain();
}
//可以进一步处理response,正式请求中可以除去部分信息,如Header里面的信息
return response;
}
}
//>3要给大领导处理
public class SecondBoss implements Character {
@Override
public Response processRequest(Chain chain) {
//正式请求中可以做其他处理,这里化简直接返回同意
Response response = new Response();
response.isAgreed = true;
System.out.println("SecondBoss Agreed");
return response;
}
}
最后来一段测试代码
public class Main {
public static void main(String[] args) {
Request request = new Request();
request.day = 1;
List<Character> characters = new ArrayList<Character>();
characters.add(new FirstBoss());
characters.add(new SecondBoss());
Chain chain = new RealChain(characters, request, 0);
chain.processChain();
}
}
各位可以自己尝试着写写,体会一下.责任链模式最精妙的地方就在于Chain的设计.《Android设计模式》里面介绍的责任链和这个有区别,书里面的责任链的实现是通过自己设置setNext的方式,这里提到的其实就是okhttp里面的写法,用的是Chain.本质还是相同的,区别就是chain的具体实现有区别