下一篇 OkHttp設(shè)計(jì)模式剖析(二)責(zé)任鏈模式
OKHTTP:
由大名鼎鼎的Square公司開發(fā)的網(wǎng)絡(luò)通信庫(kù)。
設(shè)計(jì)模式:
軟件開發(fā)中問(wèn)題的解決套路轿衔。
建造者模式簡(jiǎn)介
定義:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離害驹,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
建造者模式將一個(gè)復(fù)雜對(duì)象的創(chuàng)建過(guò)程封裝起來(lái)葫松,允許對(duì)象通過(guò)多個(gè)步驟來(lái)創(chuàng)建底洗,并且可以改變過(guò)程。尤其是在對(duì)象特別復(fù)雜珊擂,內(nèi)部參數(shù)及其多的時(shí)候费变,建造者模式就能發(fā)揮出它的優(yōu)勢(shì)。
若源代碼中有Builder這個(gè)詞胡控,大概率使用了建造者模式。
OkHttpClient類中的建造者模式
OkHttpClient就是一個(gè)內(nèi)部及其復(fù)雜的對(duì)象庇绽,內(nèi)部包含一系列超時(shí)時(shí)間(Timeout)橙困,代理(proxy),緩存(cache)辟狈,分發(fā)器(dispatcher),攔截器(interceptors)等等明未。當(dāng)然壹蔓,我們常用的就只有默認(rèn)模式。
public class OkHttpClient implements Cloneable, Call.Factory, WebSocketCall.Factory {
// 構(gòu)造函數(shù)1
public OkHttpClient() {
this(new Builder()); // 調(diào)用構(gòu)造函數(shù)1
}
// 構(gòu)造函數(shù)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);
}
}
}
利用建造者模式實(shí)例化OkHttpClient對(duì)象
// 實(shí)例化一個(gè)默認(rèn)的HTTP客戶端
OkHttpClient client = new OkHttpClient();
// 使用自定義設(shè)置創(chuàng)建HTTP客戶端實(shí)例
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new HttpLoggingInterceptor()) //增加攔截器
.cache(new Cache(cacheDir, cacheSize)) //設(shè)置用于讀取和寫入緩存響應(yīng)的響應(yīng)緩存披摄。
.build();
// 實(shí)例化一個(gè)500毫秒則超時(shí)的HTTP客戶端實(shí)例
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中蘊(yùn)含的建造者設(shè)計(jì)模式疚膊,可以讓框架使用者自行組裝所要發(fā)起的HTTP請(qǐng)求虾标,通過(guò)Builder.url設(shè)置目的地址夺巩,通過(guò)Builder.head設(shè)置HTTP請(qǐng)求的頭部周崭。
基于建造者模式構(gòu)建的其他代碼
1、OkHttp框架中的Response類
2续镇、Android源碼中的AlertDialog類
麥當(dāng)勞1+2隨心配就是一個(gè)典型的建造者設(shè)計(jì)模式
我們定義隨心配類RedWhite摸航,并在類中實(shí)現(xiàn)建造者Builder模式:
public class RedWhite{
String red;
String white;
//構(gòu)造函數(shù)
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 = "可樂(lè)";
}
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);
}
}
}
我們用建造者來(lái)構(gòu)建我們的隨心配套餐:
public static void main(String[] args) {
RedWhite rw = new RedWhite();
System.out.println(rw); // 輸出:吉士堡 + 可樂(lè)(默認(rèn))
RedWhite rw2 = new RedWhite.Builder()
.setRed("薯?xiàng)l").setWhite("雪碧")
.build();
System.out.println(rw2); // 輸出:薯?xiàng)l + 雪碧
}
所以酱虎,建造者設(shè)計(jì)模式的核心就是:自行組裝。
參考文獻(xiàn)
1聊记、設(shè)計(jì)模式|菜鳥教程:https://www.runoob.com/design-pattern/design-pattern-tutorial.html
2恢暖、《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》何紅輝,關(guān)愛民著
3舆床、隔壁老李頭:http://www.reibang.com/p/82f74db14a18