Builder模式介绍
Builder模式又称建造者模式,表示将构建过程和表示过程进行分离,让(参数)构建过程变得更加的简单和直观。
Builder模式主要用于复杂对象的构造,通过使用Builder模式可以减少构造器或方法调用传入的参数数量。这对有很多个配置参数进行初始化的对象来说尤其适用。
在实际的开发过程中,例如对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模式实现一下NavigationBar。
AbsNavigationBar的内部内 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.用来创建 NavigationBar 2. 还有存储参数
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<>();
}
/**
* 用来创建 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方法中 获取到的参数设置给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);
/**
* 绑定参数
*/
attachNavigationParams();
}
至此已经完成对NavigationBar的创建。
由navigationBar的创建,可以看出来 建造者模式可以 将构建过程和表示过程进行分离,让(参数)构建过程变得更加的简单和直观。