Builer設(shè)計(jì)模式介紹又稱構(gòu)建這模式,Builer功能存儲(chǔ)參數(shù)嵌莉。
定義.png
使用場(chǎng)景.png
以添加頭部為例
一苛茂、創(chuàng)建規(guī)則
public interface INavigation {
void createNavigationBar();
/**
* 綁定參數(shù)
*/
void attachNavigationParams();
/**
* 將 NavigationView添加到父布局
*/
void attachParent(View navigationBar, ViewGroup parent);
}
二、創(chuàng)建實(shí)現(xiàn)類
public class AbsNavigationBar<B extends AbsNavigationBar.Builder> implements INavigation {
private B mBuilder;
private View mNavigationBar;
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();
}
/**
* 綁定參數(shù)
*/
@Override
public void attachNavigationParams() {
// 設(shè)置文本
Map<Integer,CharSequence> textMaps = mBuilder.mTextMaps;
for (Map.Entry<Integer, CharSequence> entry : textMaps.entrySet()) {
TextView textView = findViewById(entry.getKey());
textView.setText(entry.getValue());
}
// 設(shè)置點(diǎn)擊事件
Map<Integer,View.OnClickListener> clickListenerMaps = mBuilder.mCLickListenerMaps;
for (Map.Entry<Integer, View.OnClickListener> entry : clickListenerMaps.entrySet()) {
View view = findViewById(entry.getKey());
view.setOnClickListener(entry.getValue());
}
}
public <T extends View> T findViewById(int viewId) {
return (T) mNavigationBar.findViewById(viewId);
}
/**
* 添加進(jìn)頭布局
* @param navigationBar
* @param parent
*/
@Override
public void attachParent(View navigationBar, ViewGroup parent) {
parent.addView(navigationBar, 0);
}
/**
* 返回 Builder
*
* @return
*/
public B getBuilder() {
return mBuilder;
}
public static abstract class Builder<B extends Builder> {
public Context mContext;
public int mLayoutId;//頭布局id
public ViewGroup mParent;//父布局
public Map<Integer, CharSequence> mTextMaps;//存儲(chǔ)文字
public Map<Integer, View.OnClickListener> mCLickListenerMaps;//存儲(chǔ)監(jiān)聽
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();
/**
* 設(shè)置文本
*
* @param viewId
* @param text
* @return
*/
public B setText(int viewId, String text) {
mTextMaps.put(viewId, text);
return (B) this;
}
/**
* 設(shè)置點(diǎn)擊事件
*
* @param viewId
* @param clickListener
* @return
*/
public B setOnClickListener(int viewId, View.OnClickListener clickListener) {
mCLickListenerMaps.put(viewId, clickListener);
return (B) this;
}
}
}
三族操、實(shí)現(xiàn)使用
public class DefaultNavigationBar extends AbsNavigationBar<DefaultNavigationBar.Builder> {
protected DefaultNavigationBar(Builder builder) {
super(builder);
}
@Override
public void attachNavigationParams() {
super.attachNavigationParams();
// 處理特有的 是否顯示返回
LinearLayout linearLayout = findViewById(R.id.ll_back);
linearLayout.setVisibility(getBuilder().mLeftVisible);
}
public static class Builder extends AbsNavigationBar.Builder<DefaultNavigationBar.Builder>{
public int mLeftVisible = View.VISIBLE;
public Builder(Context context, ViewGroup parent) {
super(context, R.layout.item_title_haveback, parent);
}
@Override
public DefaultNavigationBar create() {
return new DefaultNavigationBar(this);
}
public Builder setTitleText(String text){
setText(R.id.tv_title_text,text);
return this;
}
public Builder setLeftClickListener(View.OnClickListener clickListener){
setOnClickListener(R.id.ll_back, clickListener);
return this;
}
public Builder hideCallBack() {
mLeftVisible = View.INVISIBLE;
return this;
}
}
}
使用;
DefaultNavigationBar navigationBar =
new DefaultNavigationBar.Builder(this, rlHome)
.setTitleText("首頁")
.hideCallBack()
.setLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
})
.create();