Builer 设计模式

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();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,092评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,235评论 25 709
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,148评论 6 342
  • 第二章 2013年的某一天,我在D城,毕业刚满三年,是政府媒体的一个...
    塞北以北阅读 1,594评论 1 2
  • 想想也是,差不多一年了,再没回去…当然也不是绝对,过年回家,确实在院外遥遥一看,也是眼观了一遭… 从不否认自己是个...
    silence2016330阅读 1,387评论 0 0

友情链接更多精彩内容