OkHttp中的设计模式之一:Builder模式
OkHttp中的设计模式之一:Builder模式
- 1. 什么是Builder模式
- 2. OkHttp中的实例
- 2.1 OkHttpClient的构建方式
- 2.2 OkHttpClient中的Builder
- 2.2.1 通过Builder构建一个OkHttpClient
- 2.2.2 默认的Builder
- 2.2.3 反构建Builder
- 2.2.3.1 反构建的作用
- 2.2.3.2 反构建的实际应用
- 3. Tips
- 3.1 Builder插件
1. 什么是Builder模式
关于什么是builder模式,具体可以参考一下这篇文章。
Builder模式分为:经典builder模式和变种builder模式。而在Android项目中,一般使用的都是变种Builder模式,OkHttp中也例外。不管是OkHttpClient
还是Request
,都是通过变种Builder模式进行构建的。下面来我们来看一下OkHttp的源码,来感受一下Builder模式的应用。
2. OkHttp中的实例
OkHttp
中很多类都有用到Builder
模式,使用上都大同小异,所以下面就以OkHttpClient
为例子,来讲一下Builder
模式在OkHttp
中的应用。
2.1 OkHttpClient的构建方式
构建OkHttpClient
有两种方式:
//方式1
OkHttpClient client1 = new OkHttpClient();//方式2
OkHttpClient client2 = new OkHttpClient.Builder().writeTimeout(1000, TimeUnit.MILLISECONDS).readTimeout(1000, TimeUnit.MILLISECONDS).addInterceptor(new Interceptor() {@Overridepublic Response intercept(Chain chain) throws IOException {return null;}}).build();}
方式2很明显,一看就是通过Builder模式构建的。但是实际上,方式1内部也是通过调用了new Builder()
的方式通过构建了一个默认参数的OkHttpClient
:
public OkHttpClient() {this(new Builder());}
2.2 OkHttpClient中的Builder
2.2.1 通过Builder构建一个OkHttpClient
OkHttpClient(Builder builder) {this.dispatcher = builder.dispatcher;this.proxy = builder.proxy;this.protocols = builder.protocols;this.connectionSpecs = builder.connectionSpecs;this.interceptors = Util.immutableList(builder.interceptors);this.eventListenerFactory = builder.eventListenerFactory;if (builder.sslSocketFactory != null || !isTLS) {this.sslSocketFactory = builder.sslSocketFactory;this.certificateChainCleaner = builder.certificateChainCleaner;} else {X509TrustManager trustManager = Util.platformTrustManager();this.sslSocketFactory = newSslSocketFactory(trustManager);this.certificateChainCleaner = CertificateChainCleaner.get(trustManager);}//还有一堆参数...
}
这个没啥好说的,就是将builder
中设置过的参数一一赋值给OkHttpClient
,然后可能还会做一些判断处理,保证参数的合法性。
2.2.2 默认的Builder
public Builder() {dispatcher = new Dispatcher();protocols = DEFAULT_PROTOCOLS;connectionSpecs = DEFAULT_CONNECTION_SPECS;followRedirects = true;retryOnConnectionFailure = true;callTimeout = 0;connectTimeout = 10_000;readTimeout = 10_000;writeTimeout = 10_000;pingInterval = 0;//还有一堆参数...}
在2.1 OkHttpClient
的构建方式中我们知道,OkHttpClient
的默认构造函数中就调用了Builder()
方式。在我们自己的项目中,也可以通过这种方式设置默认的参数,特别是一些必选项,防止因为调用者没有设置必选参数而出现问题。
OkHttpClient client1 = new OkHttpClient();public OkHttpClient() {this(new Builder());}
2.2.3 反构建Builder
2.2.3.1 反构建的作用
public Builder newBuilder() {return new Builder(this);}Builder(OkHttpClient okHttpClient) {this.dispatcher = okHttpClient.dispatcher;this.proxy = okHttpClient.proxy;this.protocols = okHttpClient.protocols;this.connectionSpecs = okHttpClient.connectionSpecs;this.interceptors.addAll(okHttpClient.interceptors);//还有一堆参数...}
个人理解,反构建Builder
最主要的使用场景就是:当使用者构建了OkHttpClient
之后发现有一些参数需要改变,所以就可以通过反构建一个Builder
,然后调用Builder
的set方法修改对应的参数在build一次,生成新的OkHttpClient
对象。
当然,假如OkHttpClient
中有参数对应的set方法(实际上并没有),也是能修改参数的。但是这就违背了Builder
模式的设计原则,而且会引发一些问题:
1、比如我想重新设置
OkHttpClient
的sslSocketFactory
参数,使用Builder
模式时,在生成OkHttpClient
的时候是会做参数校验的(见2.1.1)。但是如果直接通过OkHttpClient
的set方法的形式,这个参数校验就会显得很麻烦,要在sslSocketFactory
和certificateChainCleaner
的set方法中都做一次校验。
2、这是我认为更关键的一个点:如果我们需要同时修改多个参数,并希望它们同时生效。在多线程高并发的情况下,很可能我们在获取参数配置的时候,只有部分参数是修改过的,还有部分参数是原来的值,这会引发很多不可预估的问题。
2.2.3.2 反构建的实际应用
在使用Interceptor
时,我们经常会使用到Request
的反构建,例如:
public Response intercept(Chain chain) throws IOException {Request request = chain.request();//先走p2p请求,如果失败了,再走原始url请求。Response response = chain.proceed(request.newBuilder().url(p2pUrl).build());if (response.isSuccessful()) {return response;}return chain.proceed(request);}
3. Tips
3.1 Builder插件
手打Builder是一件非常痛苦的事情。不会偷懒的程序员不是好的程序员:),所以我们可以通过Builder插件来帮助我们自动化生成Builder。插件的名字叫做InnerBuilder。可以在File–>Settings–>Plugins中搜索"InnerBuilder"下载。
使用时,只需要在类的空白处按下快捷键Alt + Insert就可以看到Builder的选项。点击后,插件就会帮助我们自动化生成一个Builder了~
OkHttp中的设计模式之一:Builder模式相关推荐
- Android设计模式之——Builder模式
一.介绍 Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程.该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程 ...
- Android常用设计模式之Builder模式理解
Android常用设计模式之Builder模式 1 单例模式 2 Builder模式 Builder模式的应用场景 总结 1 单例模式 单例模式之前有详细的介绍,可移步到链接: 常见的单例模式及其特点 ...
- Java设计模式之Builder模式
Java设计模式之Builder模式 Java设计模式之Builder模式 简介 适用性 用LOL的出装备的顺序为例 基本实现代码 BasePerson的实现 DeMaXiYa的实现 QiTianDa ...
- 「设计模式(六) - Builder模式」
「设计模式(六) - Builder模式」 一.可定制化的 电脑的组装在生活中并不陌生,大家都有电脑,当然需求不一样配置也不一样.以Macbook Pro为例,像UI设计对图像模块GPU要求比较高,跑 ...
- [Head First设计模式]山西面馆中的设计模式——装饰者模式
原文:[Head First设计模式]山西面馆中的设计模式--装饰者模式 引言 在山西面馆吃鸡蛋面的时候突然想起装饰者这个模式,觉得面馆这个场景跟书中的星巴兹咖啡的场景很像,边吃边思考装饰者模式.这里 ...
- Java 设计模式之Builder模式
设计模式系列 创建型设计模式 Java 设计模式之单例模式 Java 设计模式之静态工厂方法模式 Java 设计模式之工厂方法模式 Java 设计模式之抽象工厂模式 Java 设计模式之Builder ...
- 理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式丨C++后端开发丨Linux服务器开发丨web服务器
理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式 1. 开闭.单一职责.里氏替换.接口隔离等设计原则 2. 随处可见的模板方法 3. nginx中核心设计模式 责任链模式 4. 责 ...
- Android常考问题(8)-设计模式:Builder模式(顺带学习了一下String的比较和final)
今天的主要目的是学习设计模式中的Builder模式.由于java基础不牢固,在学习过程中要回过头去学习java内容,因此凑成了这样一篇驳杂的文章. Builder模式 首先是Builder设计模式的作 ...
- 【设计模式】Builder模式
一.前言 设计模式系列(参考资料:<Android源码设计模式解析与实战>--何红辉.关爱明) 单例模式 Builder模式 原型模式 二.介绍 我们开发中偶尔会遇到一些需要设置10个或以 ...
- 码农小汪-设计模式之-Builder模式
建造者模式 将一个复杂的对象的构建与它的表示分离,使得同样构建的过程中可以创建不同的表示.这个话语看起来,好累啊!真心很难理解. 下面是它的UML图: 抽象建造者角色(Builder):为创建一个Pr ...
最新文章
- TCP协议实现文件传输
- java implements t_Java泛型——為什么“擴展T”允許而不是“實現T”?
- Java并发包基石-AQS详解
- php文本框限制字节,js限制文本框输入长度两种限制方式(长度、字节数)_基础知识...
- 批量查进程linux,linux 批量删除进程与查看进程详解
- SQL Server-【知识与实战VIII】触发器(上)
- 拓端tecdat|R语言解决最优化问题-线性规划(LP)问题
- 踩坑事件:windows操作系统下的eclipse中编写SparkSQL不能从本地读取或者保存parquet文件
- iOS autoreleasePool 深入理解
- 阿里笔试题解(2020.4.17场)
- M1 芯片Macbook pro连接支持AirPrint的佳能打印机
- 等额本金等额本息推导
- kali linux安装微信,kali liunx2020.2最简单的安装微信,QQ等windows软件,同样适合,Debian Ubuntu...
- 【滤波跟踪】基于EKF、时差和频差定位实现目标跟踪附matlab代码
- 软件架构与设计(十)-----架构技术
- PL/SQL Developer中用dbms_output.put_line输出
- 干货丨李睿:新时代的医学影像及心脑血管成像的应用
- ESP8266-12F最小系统板程序烧录
- notepad++中文简体下载
- 在线体验 Windows 11「GitHub 热点速览 v.21.30」