网络层架构设计与实战六客户端设计之工厂模式封装httpRequest

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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值