Android 設(shè)計(jì)模式:(三)Builder模式

前言
本文是對(duì)《Adroid 源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》 何紅輝吕朵、關(guān)愛民 著 人民郵電出版社所做的讀書筆記猎醇。文章是對(duì)本書的一些列學(xué)習(xí)筆記,如若有侵犯到作者權(quán)益努溃,還望作者能聯(lián)系我硫嘶,我會(huì)及時(shí)下架。
這本書不錯(cuò)梧税,有興趣的同學(xué)可以買原書看看沦疾。
感興趣的朋友歡迎加入學(xué)習(xí)小組QQ群: 193765960称近。

版權(quán)歸作者所有,如有轉(zhuǎn)發(fā)哮塞,請(qǐng)注明文章出處:https://xiaodanchen.github.io/archives/

相關(guān)文章:

Android 設(shè)計(jì)模式:(一)面向?qū)ο蟮牧笤瓌t
Android 設(shè)計(jì)模式:(二)單例模式
Android 設(shè)計(jì)模式:(三)Builder模式
Android 設(shè)計(jì)模式:(四)原型模式
Android 設(shè)計(jì)模式:(五)工廠方法模式
Android 設(shè)計(jì)模式:(六)抽象工廠模式
Android 設(shè)計(jì)模式:(七)策略模式

1. Bulider模式的定義

將一個(gè)復(fù)雜對(duì)象的構(gòu)建與他的表示分離刨秆,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。對(duì)于一個(gè)復(fù)雜的對(duì)象忆畅,為了在構(gòu)建過程中對(duì)外部隱藏實(shí)現(xiàn)細(xì)節(jié)或者想要對(duì)對(duì)象的內(nèi)部組件根據(jù)需要實(shí)現(xiàn)靈活的配置衡未,就可以使用Builder模式將部件和組裝過程分離,使得構(gòu)建過程和部件都可以自由擴(kuò)展家凯,兩者之間的耦合也降到最低缓醋。
通常會(huì)將Builder設(shè)計(jì)為鏈?zhǔn)秸{(diào)用,他的關(guān)鍵點(diǎn)是每個(gè)setter方法都返回自身肆饶,也就是return this改衩,這樣就使得setter方法可以鏈?zhǔn)秸{(diào)用。通過這種形式驯镊,使得整個(gè)結(jié)構(gòu)更加簡(jiǎn)單葫督,也能對(duì)復(fù)雜類對(duì)象的組裝過程實(shí)現(xiàn)更精細(xì)化的控制。

2. Bulider模式的實(shí)現(xiàn)

下面我將以我們?cè)谥暗奈恼?a target="_blank" rel="nofollow">《Android 設(shè)計(jì)模式:(一)面向?qū)ο蟮牧笤瓌t》中作為示例的ImageLoader為例來(lái)舉例板惑。

代碼

簡(jiǎn)單點(diǎn)橄镜,假設(shè)我們要求ImageLoader可以設(shè)置緩存策略,設(shè)置加載中占位圖冯乘,設(shè)置加載失敗背景圖洽胶,這是加載資源URI,設(shè)置ImageView和加載成功失敗的回調(diào)監(jiān)聽器這幾個(gè)常見的設(shè)置裆馒。
那么姊氓,框架大體如下:
2.1 定義緩存策略接口

/**
* 緩存策略接口類
*/
public interface ImageCache{
  public Bitmap get(String url);
  public void put(String url, Bitmap bmp);
}

2.2 定義一個(gè)屬性設(shè)置輔助類

/**
* 屬性設(shè)置輔助類:
* 偷個(gè)懶,就不寫成setter和getter形式的了
*/
public class ImageLoaderController{
  //加載中占位圖
  public int loadingPlaceHolder;
  //加載失敗背景圖
  public int loadfailedPlaceHolder;
  //加載資源URI
  public String uri;
  //ImageView
  public View target;
}

2.3 定義加載狀態(tài)回調(diào)接口

/**
* 緩存策略接口類
*/
public interface LoadListener{
  void onLoading();
  void onLoadFailed();
  void onLoadSucceed();
}

2.4 實(shí)現(xiàn)ImageLoader類

/**
* ImageLoader類:
*/
public class ImageLoader{
  //加載策略
  private ImageCache mImageCache;
  //加載失敗背景圖
  private ImageLoaderController mController;
  //加載狀態(tài)監(jiān)聽器
  public LoadListener mLoadListener;
  
  private ImageLoader(){
    mController = new ImageLoaderController();
  }
  
  //執(zhí)行請(qǐng)求
  private void load(){
    //發(fā)起加載請(qǐng)求喷好,根據(jù)加載策略加載資源等
    ...
  }
  
  public static class Builder{
    private ImageLoader mImageLoader;
    public Builder(){
      mImageLoader = new ImageLoader();
    }
    
    public Builder setLoadingPlaceHolder(int resId){
      mImageLoader.mController.loadingPlaceHolder = resId;
      return this;
    }
    
    public Builder setLoadfailedPlaceHolder(int resId){
      mImageLoader.mController.loadfailedPlaceHolder = resId;
      return this;
    }
    
    public Builder seUri(String uri){
      mImageLoader.mController.uri = uri;
      return this;
    }
    
    public Builder setTarget(View target){
      mImageLoader.mController.target = target;
      return this;
    }
    
    public Builder setCache(ImageCache cache){
      mImageLoader.mImageCache = cache;
      return this;
    }
    
    public Builder setLoadListener(LoadListener listener){
      mImageLoader.mLoadListener = listener;
      return this;
    }
    
    public ImageLoader build(){
      mImageLoader.load();
      return mImageLoader;
    }
  }
}

用戶使用

ImageLoader.Builder builder = ImageLoader.Builder();
builder.setLoadingPlaceHolder(R.drawable.iv_loading)
       .setLoadfailedPlaceHolder(R.drawable.iv_loadfailed)
       .seUri(url)
       .setTarget(imageview)
       .setCache(mDoubleCache)
       .setLoadListener(mLoadListener)
       .build();

總結(jié)

本文所寫的實(shí)例代碼可能不太實(shí)用翔横,但是僅僅是為了說(shuō)明一下Builder模式。
Bulider模式:

  • 配置靈活:開發(fā)者不需要設(shè)計(jì)一系列的構(gòu)造函數(shù)來(lái)滿足各種各樣的需求
  • 利于擴(kuò)展:假如我們的類需要擴(kuò)展屬性(能力)梗搅,只需要增加屬性和配置函數(shù)禾唁。符合開閉原則
  • 基本不用修改老的代碼:符合開閉原則
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市无切,隨后出現(xiàn)的幾起案子荡短,更是在濱河造成了極大的恐慌,老刑警劉巖哆键,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掘托,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡洼哎,警方通過查閱死者的電腦和手機(jī)烫映,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門沼本,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)噩峦,“玉大人锭沟,你說(shuō)我怎么就攤上這事∈恫梗” “怎么了族淮?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凭涂。 經(jīng)常有香客問我祝辣,道長(zhǎng),這世上最難降的妖魔是什么切油? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任蝙斜,我火速辦了婚禮,結(jié)果婚禮上澎胡,老公的妹妹穿的比我還像新娘孕荠。我一直安慰自己,他們只是感情好攻谁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布稚伍。 她就那樣靜靜地躺著,像睡著了一般戚宦。 火紅的嫁衣襯著肌膚如雪个曙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天受楼,我揣著相機(jī)與錄音垦搬,去河邊找鬼。 笑死艳汽,一個(gè)胖子當(dāng)著我的面吹牛猴贰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骚灸,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼糟趾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了甚牲?” 一聲冷哼從身側(cè)響起义郑,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丈钙,沒想到半個(gè)月后非驮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雏赦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年劫笙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芙扎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡填大,死狀恐怖戒洼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情允华,我是刑警寧澤圈浇,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站靴寂,受9級(jí)特大地震影響磷蜀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜百炬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一褐隆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剖踊,春花似錦庶弃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至圃验,卻和暖如春掉伏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背澳窑。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工斧散, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摊聋。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓鸡捐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親麻裁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子箍镜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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