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

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();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末苛坚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子色难,更是在濱河造成了極大的恐慌泼舱,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枷莉,死亡現(xiàn)場(chǎng)離奇詭異娇昙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)笤妙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門冒掌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來噪裕,“玉大人,你說我怎么就攤上這事股毫∩乓簦” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵铃诬,是天一觀的道長(zhǎng)祭陷。 經(jīng)常有香客問我,道長(zhǎng)氧急,這世上最難降的妖魔是什么颗胡? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮吩坝,結(jié)果婚禮上毒姨,老公的妹妹穿的比我還像新娘。我一直安慰自己钉寝,他們只是感情好弧呐,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嵌纲,像睡著了一般俘枫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逮走,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天鸠蚪,我揣著相機(jī)與錄音,去河邊找鬼师溅。 笑死茅信,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的墓臭。 我是一名探鬼主播蘸鲸,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼窿锉!你這毒婦竟也來了酌摇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤嗡载,失蹤者是張志新(化名)和其女友劉穎窑多,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洼滚,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埂息,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耿芹。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挪哄,靈堂內(nèi)的尸體忽然破棺而出吧秕,到底是詐尸還是另有隱情,我是刑警寧澤迹炼,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布砸彬,位于F島的核電站,受9級(jí)特大地震影響斯入,放射性物質(zhì)發(fā)生泄漏砂碉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一刻两、第九天 我趴在偏房一處隱蔽的房頂上張望增蹭。 院中可真熱鬧,春花似錦磅摹、人聲如沸滋迈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饼灿。三九已至,卻和暖如春帝美,著一層夾襖步出監(jiān)牢的瞬間碍彭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工悼潭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庇忌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓女责,卻偏偏與公主長(zhǎng)得像漆枚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抵知,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

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