美文网首页
OkHttp设计模式剖析(一)建造者模式

OkHttp设计模式剖析(一)建造者模式

作者: YongtaoHuang | 来源:发表于2019-07-13 21:55 被阅读0次

下一篇 OkHttp设计模式剖析(二)责任链模式

OKHTTP:

由大名鼎鼎的Square公司开发的网络通信库。

设计模式:

软件开发中问题的解决套路。

建造者模式简介

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式将一个复杂对象的创建过程封装起来,允许对象通过多个步骤来创建,并且可以改变过程。尤其是在对象特别复杂,内部参数及其多的时候,建造者模式就能发挥出它的优势。
若源代码中有Builder这个词,大概率使用了建造者模式。

OkHttpClient类中的建造者模式

OkHttpClient就是一个内部及其复杂的对象,内部包含一系列超时时间(Timeout),代理(proxy),缓存(cache),分发器(dispatcher),拦截器(interceptors)等等。当然,我们常用的就只有默认模式。

public class OkHttpClient implements Cloneable, Call.Factory, WebSocketCall.Factory {
  // 构造函数1
  public OkHttpClient() {
    this(new Builder()); // 调用构造函数1
  }  
  // 构造函数2
  private OkHttpClient(Builder builder) {
    ......
  }  
  public Builder newBuilder() {
    return new Builder(this);
  }
  // Builder类
  public static final class Builder {  
    public Builder() { }   
    Builder(OkHttpClient okHttpClient) { }    
    //Builder类的OkHttpClient
    public OkHttpClient build() {
      return new OkHttpClient(this);
    }  
   }  
}

利用建造者模式实例化OkHttpClient对象

// 实例化一个默认的HTTP客户端
OkHttpClient client = new OkHttpClient();
// 使用自定义设置创建HTTP客户端实例
OkHttpClient client = new OkHttpClient.Builder()
                                .addInterceptor(new HttpLoggingInterceptor())  //增加拦截器
                                .cache(new Cache(cacheDir, cacheSize))  //设置用于读取和写入缓存响应的响应缓存。
                                .build();
//  实例化一个500毫秒则超时的HTTP客户端实例                         
OkHttpClient eagerClient = client.newBuilder()
                                .readTimeout(500, TimeUnit.MILLISECONDS)
                                .build();   

Request类中的建造者模式

public final class Request {

  private Request(Builder builder) {
    ......
  }

  public Builder newBuilder() {
    return new Builder(this);
  }

  public static class Builder {   
    private HttpUrl url;
    public Builder() {
      ......
    }
    private Builder(Request request) {
      this.url = request.url;
      ......
    }
    public Builder url(HttpUrl url) {}
    public Builder header(String name, String value) {}
    ......
    public Request build() {
      if (url == null) throw new IllegalStateException("url == null");
      return new Request(this);             
    }
  }
  
}

Request中蕴含的建造者设计模式,可以让框架使用者自行组装所要发起的HTTP请求,通过Builder.url设置目的地址,通过Builder.head设置HTTP请求的头部。

基于建造者模式构建的其他代码

1、OkHttp框架中的Response类
2、Android源码中的AlertDialog类

麦当劳1+2随心配就是一个典型的建造者设计模式

RedWhite.png

我们定义随心配类RedWhite,并在类中实现建造者Builder模式:

public class RedWhite{
    String red;
    String white;   
    //构造函数
    public RedWhite(){
        this(new Builder());
    }
    private RedWhite(Builder builder){
        this.red = builder.red;
        this.white = builder.white;
    }   
    public String toString(){
        return red+" + "+white;
    }   
    //建造者
    public static class Builder{
        private String red;
        private String white;   
        public Builder(){
            this.red = "吉士堡";
            this.white = "可乐";
        }   
        private Builder(RedWhite redWhite){
            this.red = redWhite.red;
            this.white = redWhite.white;    
        }       
        public Builder setRed(String red){
            this.red = red;
            return this;
        }       
        public Builder setWhite(String white){
            this.white = white;
            return this;
        }       
        public RedWhite build(){
            return new RedWhite(this);
        }
    }
}

我们用建造者来构建我们的随心配套餐:

public static void main(String[] args) {
    RedWhite rw = new RedWhite();
    System.out.println(rw); // 输出:吉士堡 + 可乐(默认)  
    RedWhite rw2 = new RedWhite.Builder()
            .setRed("薯条").setWhite("雪碧")
            .build();
    System.out.println(rw2); // 输出:薯条 + 雪碧
}

所以,建造者设计模式的核心就是:自行组装。

参考文献

1、设计模式|菜鸟教程:https://www.runoob.com/design-pattern/design-pattern-tutorial.html
2、《Android源码设计模式解析与实战》何红辉,关爱民著
3、隔壁老李头:https://www.jianshu.com/p/82f74db14a18

下一篇 OkHttp设计模式剖析(二)责任链模式

All is well.

相关文章

网友评论

      本文标题:OkHttp设计模式剖析(一)建造者模式

      本文链接:https://www.haomeiwen.com/subject/outukctx.html