OkHttp設(shè)計(jì)模式剖析(一)建造者模式

下一篇 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.png

我們定義隨心配類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

下一篇 OkHttp設(shè)計(jì)模式剖析(二)責(zé)任鏈模式

All is well.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挨队,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瞒瘸,更是在濱河造成了極大的恐慌,老刑警劉巖省撑,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竟秫,死亡現(xiàn)場(chǎng)離奇詭異跷乐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)愕提,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門浅侨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人如输,你說(shuō)我怎么就攤上這事不见。” “怎么了稳吮?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵灶似,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我喻奥,道長(zhǎng)撞蚕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任纺铭,我火速辦了婚禮,結(jié)果婚禮上舶赔,老公的妹妹穿的比我還像新娘竟纳。我一直安慰自己,他們只是感情好锥累,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布桶略。 她就那樣靜靜地躺著,像睡著了一般际歼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吕粗,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天巴帮,我揣著相機(jī)與錄音榕茧,去河邊找鬼客给。 笑死,一個(gè)胖子當(dāng)著我的面吹牛靶剑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缎讼,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼坑匠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了夹纫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茅姜,失蹤者是張志新(化名)和其女友劉穎月匣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體航唆,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡糯钙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年退腥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片享潜。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗅蔬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出艺蝴,到底是詐尸還是另有隱情鸟废,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布缩擂,位于F島的核電站添寺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏计露。R本人自食惡果不足惜楞捂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一寨闹、第九天 我趴在偏房一處隱蔽的房頂上張望君账。 院中可真熱鬧,春花似錦椭蹄、人聲如沸净赴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)金度。三九已至,卻和暖如春猜极,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丢胚。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工受扳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骨宠。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓相满,卻偏偏與公主長(zhǎng)得像桦卒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子建蹄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容