1、具体的网络请求只是实现了OkHttpRequest,但是框架不光可以使用OkHttp的请求方式,它也可以支持使用原生的URLConnection系统提供的一个网络请求,那就需要设计一个接口。实际上已经定义好了和http请求相关的接口,如果要实现HttpURL的拓展,只需要继承HttpRequest这样一个对象就可以了。但是这些只是对网络请求一些最基本的封装,但是对于上层调用来说,还是需要对业务层进行进一步的封装。封装过程中,我们需要将OkHttpRequest通过一种机制来生成供上层来调用,对于上层来说只需要拿到OkHttpRequest对象就可以了,至于OkHttpRequest是通过okhttpclient去实现的还是通过URLConnection来实现的,对上层开发者来说并不需要关注。
2、为了解决上面的设计,需要定义这样一个interface,引入了工厂设计模式。
它可以解决的实际问题:
①解决复杂对象的创建过程。对于复杂对象,创建过程非常复杂,还需要进行很多的初始化,但是对于上层来说,创建地多么复杂,跟我一点关系都没有,工厂模式就能解决这样一个问题。
②工厂模式是典型的解耦模式的框架设计。因为可以通过工厂封装了一些复杂的创建过程的细节,把职责变得更加单一,只需要创建单一类型的工厂对象就可以了
3、定义接口
public interface HttpRequestFactory {
HttpRequest createHttpRequest(URI uri, HttpMethod method) throws IOException;
}
4、对接口的具体实现
package com.imooc;
import com.imooc.http.HttpMethod;
import com.imooc.http.HttpRequest;
import java.net.URI;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
/**
* @author nate
*/
public class OkHttpRequestFactory implements HttpRequestFactory {
private OkHttpClient mClient;
public OkHttpRequestFactory() {
this.mClient = new OkHttpClient();
}
public OkHttpRequestFactory(OkHttpClient client) {
this.mClient = client;
}
public void setReadTimeOut(int readTimeOut) {
this.mClient = mClient.newBuilder().
readTimeout(readTimeOut, TimeUnit.MILLISECONDS).
build();
}
public void setWriteTimeOut(int writeTimeOut) {
this.mClient = mClient.newBuilder().
writeTimeout(writeTimeOut, TimeUnit.MILLISECONDS).
build();
}
public void setConnectionTimeOut(int connectionTimeOut) {
this.mClient = mClient.newBuilder().
connectTimeout(connectionTimeOut, TimeUnit.MILLISECONDS).
build();
}
@Override
public HttpRequest createHttpRequest(URI uri, HttpMethod method) {
return new OkHttpRequest(mClient, method, uri.toString());
}
}
5、通过factory对具体的实现再进行一次封装,对不同的类库进行切换
public class HttpRequestProvider {
private static boolean OKHTTP_REQUEST = Utills.isExist("okhttp3.OkHttpClient", HttpRequestProvider.class.getClassLoader());
private HttpRequestFactory mHttpRequestFactory;
public HttpRequestProvider() {
if (OKHTTP_REQUEST) {
mHttpRequestFactory = new OkHttpRequestFactory();
}
}
public HttpRequest getHttpRequest(URI uri, HttpMethod httpMethod) throws IOException {
return mHttpRequestFactory.createHttpRequest(uri, httpMethod);
}
public HttpRequestFactory getHttpRequestFactory() {
return mHttpRequestFactory;
}
public void setHttpRequestFactory(HttpRequestFactory httpRequestFactory) {
mHttpRequestFactory = httpRequestFactory;
}
}
工具类:
public class Utills {
public static boolean isExist(String className, ClassLoader loader) {
try {
Class.forName(className);
return true;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return false;
}
}