OkHttp3源码解析--设计模式,android开发实习面试题

this.cache = builder.cache;

}

//构造者

public static final class Builder {

Cache cache;

//构造cache属性值

public Builder cache(@Nullable Cache cache) {

this.cache = cache;

return this;

}

//在build方法中真正创建OkHttpClient对象,并传入前面构造的属性值

public OkHttpClient build() {

return new OkHttpClient(this);

}

}

}

//在创建OkHttpClient的时候

OkHttpClient client = new OkHttpClient.Builder()

.cache(/创建cache对象/)

.build();

工厂模式

====

直接看代码:

public interface Call extends Cloneable {

Reque

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

st request();

Response execute() throws IOException;

void enqueue(Callback responseCallback);

void cancel();

boolean isExecuted();

boolean isCanceled();

Call clone();

//创建Call实现对象的工厂

interface Factory {

//创建新的Call,里面包含了Request对象。

Call newCall(Request request);

}

}

public class OkHttpClient implements Cloneable, Call.Factory, WebSocket.Factory {

@Override public Call newCall(Request request) {

return RealCall.newRealCall(this, request, false /* for web socket */);

}

}

final class RealCall implements Call {

}

在Call接口中,有一个内部工厂Factory接口。这样只要像下面这样就可以了:

  • 实现Call接口,现实相应的功能,RealCall;

  • 使用某个类(OkHttpClient)实现Call.Factory接口,在newCall中返回RealCall对象,就可以了。

观察者模式

=====

源码中的EventListener对请求/响应过程中的每一个Event通过方法回调的方式通知前方用户,用户需要自己实现EventListener中的所需要的方法:

public abstract class EventListener {

public void requestHeadersStart(Call call) {}

public void requestHeadersEnd(Call call, Request request) {}

public void requestBodyStart(Call call) {}

public void requestBodyEnd(Call call, long byteCount) {}

public void responseHeadersStart(Call call) {}

public void responseHeadersEnd(Call call, Response response) {}

public void responseBodyStart(Call call) {}

public void responseBodyEnd(Call call, long byteCount) {}

}

使用了abstract抽象类,而不是接口,这样用户可以选择实现需要的方法。

单例模式

==============================================================================================================================

首先,创建OkHttpClient对象的时候,就推荐使用单例模式,防止创建多个OkHttpClient对象,损耗资源;

然后,代码中的单例模式:

public class Platform {

private static final Platform PLATFORM = findPlatform();

public static Platform get() {

return PLATFORM;

}

}

对于Platform这样概念,每一个应用运行的平台都是固定的,所以需要使用一个单例模式,不需要创建多个Platform对象。

策略模式

====

在CacheInterceptor中,在响应数据的选择中使用了策略模式,选择缓存数据还是选择网络访问。

CacheInterceptor根据一个缓存策略,来决定选择缓存数据,还是网络请求数据:

1、 请求头包含 “If-Modified-Since” 或 “If-None-Match” 暂时不走缓存

2、 客户端通过 cacheControl 指定了无缓存,不走缓存

你可能感兴趣的:(OkHttp3源码解析--设计模式,android开发实习面试题)