Builer 設(shè)計(jì)模式

Builer設(shè)計(jì)模式介紹又稱構(gòu)建這模式,Builer功能存儲(chǔ)參數(shù)。


定義.png
使用場景.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();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,082評論 25 709
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,275評論 6 342
  • 第二章 2013年的某一天,我在D城,畢業(yè)剛滿三年,是政府媒體的一個(gè)...
    塞北以北閱讀 239評論 1 2
  • 想想也是,差不多一年了,再?zèng)]回去…當(dāng)然也不是絕對,過年回家,確實(shí)在院外遙遙一看,也是眼觀了一遭… 從不否認(rèn)自己是個(gè)...
    silence2016330閱讀 204評論 0 0

友情鏈接更多精彩內(nèi)容