Android大法好Android技术知识Android知识

retrofit第一步拆解 -- 构造者模式

2016-10-10  本文已影响262人  最最最最醉人

引言

关于retrofit源码解析的文章已经有很多了,我在拜读了许多文章之后在此记录一下,算是对retrofit的一个深入理解,以及其中用到的设计模式的学习。

构造者模式

构造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。
构造者模式的优点是:使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

public class Student {

    private int id;
    private String name;
    private String passwd;
    private String sex;
    private String address;

    // 构造器尽量缩小范围
    private Student() {
    }

    // 构造器尽量缩小范围
    private Student(Student origin) {
        // 拷贝一份
        this.id = origin.id;
        this.name = origin.name;
        this.passwd = origin.passwd;
        this.sex = origin.sex;
        this.address = origin.address;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getPasswd() {
        return passwd;
    }

    public String getSex() {
        return sex;
    }

    public String getAddress() {
        return address;
    }

    /**
     * Student的创建完全依靠Student.Builder,使用一种方法链的方式来创建
     *
     */
    public static class Builder {

        private Student target;

        public Builder() {
            target = new Student();
        }

        public Builder address(int id) {
            target.id = id;
            return this;
        }

        public Builder name(String name) {
            target.name = name;
            return this;
        }

        public Builder password(String passwd) {
            target.passwd = passwd;
            return this;
        }

        public Builder sex(String sex) {
            target.sex = sex;
            return this;
        }

        public Builder address(String address) {
            target.address = address;
            return this;
        }

        public Student build() {
            return new Student(target);
        }   
    }
}

使用Student s=new Student.Builder().name("CC").password("qwerty").sex("男").address("银河系第二旋臂").build();

Retrofit中的构造者模式

Retrofit retrofit = new Retrofit.Builder()
                .client(getOkHttpClient())
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
public Retrofit build() {
      // 必须得设置baseUrl,不然就直接抛出异常
      if (baseUrl == null) {
        throw new IllegalStateException("Base URL required.");
      }
      // 如果不设置okhttp3.Call.Factory,会默认直接new OkHttpClient();可见如果需要对okhttpclient进行详细的设置,需要构建OkHttpClient对象,然后传入;
      okhttp3.Call.Factory callFactory = this.callFactory;
      if (callFactory == null) {
        callFactory = new OkHttpClient();
      }
      // 用来将回调传递到UI线程的。 这里有一个platform对象,可以利用该对象进行平台的判断:如果是Android平台,会自定义一个Executor对象,并且利用Looper.getMainLooper()实例化一个handler对象,在Executor内部通过handler.post(runnable)
      Executor callbackExecutor = this.callbackExecutor;
      if (callbackExecutor == null) {
        callbackExecutor = platform.defaultCallbackExecutor();
      }

      // Make a defensive copy of the adapters and add the default Call adapter.
      // adapterFactories,这个对象主要用于对Call进行转化,基本上不需要我们自己去自定义。
      List<CallAdapter.Factory> adapterFactories = new ArrayList<>(this.adapterFactories);
      adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));

      // Make a defensive copy of the converters.
      // converterFactories,该对象用于转化数据,例如将返回的responseBody转化为对象等;当然不仅仅是针对返回的数据,还能用于一般备注解的参数的转化例如@Body标识的对象做一些操作
      List<Converter.Factory> converterFactories = new ArrayList<>(this.converterFactories);

      // 返回retrofit对象
      return new Retrofit(callFactory, baseUrl, converterFactories, adapterFactories,
          callbackExecutor, validateEagerly);
    }

相关参考链接

Retrofit2 完全解析 探索与okhttp之间的关系
别人家SDK中的设计模式--Android Retrofit库源码解读
Retrofit分析-漂亮的解耦套路
独特的架构方式,Retrofit源码简析。

上一篇下一篇

猜你喜欢

热点阅读