美文网首页
Builer 设计模式

Builer 设计模式

作者: Ayres | 来源:发表于2017-10-11 17:54 被阅读0次

Builer设计模式介绍又称构建这模式,Builer功能存储参数。


定义.png 使用场景.png

以添加头部为例

一、创建规则

public interface INavigation {
void createNavigationBar();

/**
 * 绑定参数
 */
void attachNavigationParams();

/**
 * 将 NavigationView添加到父布局
 */
void attachParent(View navigationBar, ViewGroup parent);
}

二、创建实现类

   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);
    // 绑定参数
    attachNavigationParams();
}

/**
 * 绑定参数
 */
@Override
public void attachNavigationParams() {

    // 设置文本
    Map<Integer,CharSequence> textMaps = mBuilder.mTextMaps;
    for (Map.Entry<Integer, CharSequence> entry : textMaps.entrySet()) {
        TextView textView = findViewById(entry.getKey());
        textView.setText(entry.getValue());
    }
    // 设置点击事件
    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);
}
/**
 * 添加进头布局
 * @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;//存储文字
    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 clickListener
     * @return
     */
    public B setOnClickListener(int viewId, View.OnClickListener clickListener) {
        mCLickListenerMaps.put(viewId, clickListener);
        return (B) this;
    }
}
 }

三、实现使用

  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();

相关文章

  • Builer 设计模式

    Builer设计模式介绍又称构建这模式,Builer功能存储参数。 以添加头部为例 一、创建规则 二、创建实现类 ...

  • Android studio 阿里云镜像

    将项目中builer.gradle中google() 和 jcenter()替换为maven{ url 'http...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • 设计模式笔记汇总

    目录 设计原则 “依赖倒置”原则 未完待续... 设计模式 设计模式——策略模式 设计模式——装饰者模式 设计模式...

  • 设计模式

    《C#设计模式》 《C#设计模式》-设计模式概述 《C#设计模式》-面向对象设计原则 《C#设计模式》-单例模式 ...

  • 浅谈JS的一些设计模式

    @(书籍阅读)[JavaScript, 设计模式] 常见设计模式 设计模式简介 设计模式概念解读 设计模式的发展与...

  • 前端设计模式

    JS设计模式一:工厂模式jS设计模式二:单例模式JS设计模式三:模块模式JS设计模式四:代理模式JS设计模式五:职...

  • 设计模式之工厂模式

    设计模式之工厂模式 标签(空格分隔): 设计模式 工厂模式 设计模式的感念 设计模式的应用 工厂设计模式的产生 工...

  • JavaJavascript基础进阶(十七)JS中常用的设计模式

    单利设计模式、构造原型设计模式、发布订阅设计模式、promise设计模式 单利模式 构造原型设计模式 最贴近OOP...

  • 设计模式 - 目录

    设计模式01 - 单例模式 设计模式02 - 工厂模式 设计模式03 - 建造者模式 设计模式04 - 适配器模式...

网友评论

      本文标题:Builer 设计模式

      本文链接:https://www.haomeiwen.com/subject/wfowyxtx.html