前言
本文是對(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ù)禾唁。符合開閉原則
- 基本不用修改老的代碼:符合開閉原則