Builder模式介紹
Builder模式又稱建造者模式喳钟,表示將構建過程和表示過程進行分離,讓(參數(shù))構建過程變得更加的簡單和直觀欠啤。
Builder模式主要用于復雜對象的構造荚藻,通過使用Builder模式可以減少構造器或方法調(diào)用傳入的參數(shù)數(shù)量。這對有很多個配置參數(shù)進行初始化的對象來說尤其適用洁段。
在實際的開發(fā)過程中应狱,例如對OkHttp進行初始化的的代碼如下:
OkHttpClient client = new OkHttpClient();
client.writeTimeoutMillis();
client.callTimeoutMillis();
client.readTimeoutMillis();
client.connectTimeoutMillis();
client.interceptors();
當使用Builder模式時代碼如下:
OkHttpClient client1 = new OkHttpClient.Builder()
.writeTimeout()
.callTimeout()
.addInterceptor()
.readTimeout()
.build();
可以看到代碼簡單清晰很多了。下面用Builder模式實現(xiàn)一下NavigationBar祠丝。
AbsNavigationBar的內(nèi)部內(nèi) Builder中 可以看到兩個方法Builder和creat
public static class Builder extends AbsNavigationBar.Builder<NavigationBar.Builder>{
public Builder(Context context, int layoutId, ViewGroup parent) {
super(context, layoutId, parent);
}
@Override
public AbsNavigationBar create() {
return new NavigationBar(this);
}
}
接下來點進Builder方法中可以看到疾呻,Builder中做了1.用來創(chuàng)建 NavigationBar 2. 還有存儲參數(shù)
public static abstract class Builder<B extends Builder>{
public Context mContext;
public int mLayoutId;
public ViewGroup mParent;
public Map<Integer,CharSequence> mTextMaps;
public Map<Integer,View.OnClickListener> mClickListenerMaps;
public Builder(Context context,int layoutId,ViewGroup parent){
this.mContext = context;
this.mLayoutId = layoutId;
this.mParent = parent;
mTextMaps = new HashMap<>();
mClickListenerMaps = new HashMap<>();
}
/**
* 用來創(chuàng)建 NavigationBar
* @return
*/
public abstract AbsNavigationBar create();
/**
* 設置文本
* @param viewId
* @param text
* @return
*/
public B setText(int viewId,String text){
mTextMaps.put(viewId,text);
return (B)this;
}
/**
* 設置點擊事件
* @param viewId
* @param onClickListener
* @return
*/
public B setOnClickListener(int viewId,View.OnClickListener onClickListener){
mClickListenerMaps.put(viewId,onClickListener);
return (B) this;
}
}
在create方法中,可以看到做的事情是將 builder方法中 獲取到的參數(shù)設置給navigationBar
protected AbsNavigationBar(B builder){
this.mBuilder = builder;
createNavigationBar();
}
@Override
public void createNavigationBar() {
mNavigationBar = LayoutInflater.from(mBuilder.mContext)
.inflate(mBuilder.mLayoutId,mBuilder.mParent,false);
/**
* 添加
*/
attachParent(mNavigationBar,mBuilder.mParent);
/**
* 綁定參數(shù)
*/
attachNavigationParams();
}
至此已經(jīng)完成對NavigationBar的創(chuàng)建写半。
由navigationBar的創(chuàng)建岸蜗,可以看出來 建造者模式可以 將構建過程和表示過程進行分離,讓(參數(shù))構建過程變得更加的簡單和直觀叠蝇。