Android设计模式——建造者模式

我感觉这个设计模式真是太简单,太好用了,这是一个创建型模式,定义是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。我的理解就是不需要关心建造过程,就像做菜一样,需要啥直接拿过来用,想放酱油就拿酱油,想放醋就放醋。

用途也很多,Retrofit和OkHttp都是用这个模式创建的,先看下OK HTTP的吧,简单说就是想增加拦截器就直接增加,想设置缓存也是直接设置,就像组装一样:

public class OkHttpClient implements Cloneable, Call.Factory, WebSocket.Factory {
  .....
 //构造函数
  public OkHttpClient() {
    this(new Builder());
  }
//不管咋构建的,都会调用这个构造函数
  OkHttpClient(Builder builder) {
    this.dispatcher = builder.dispatcher;
    this.proxy = builder.proxy;
    this.protocols = builder.protocols;
    ......
  }

  public Builder newBuilder() {
    return new Builder(this);
  }
  //Builder类
  public static final class Builder {
    Dispatcher dispatcher;
    ...
    int pingInterval;

    public Builder() {
        dispatcher = new Dispatcher();
        protocols = DEFAULT_PROTOCOLS;
        ...
    }
   Builder(OkHttpClient okHttpClient) {
     this.dispatcher = okHttpClient.dispatcher;
     this.proxy = okHttpClient.proxy;
     ...
   }

    ...
   //最后创建的是OkHttpClient类的对象
    public OkHttpClient build() {
      return new OkHttpClient(this);
    }
  }
}

接下来自己写个创建模式的弹出框吧,我实现了一个通用的dialog:

public class CommonAlertDialog extends Dialog {
    private final String TITLE;//题目
    private final String MESSAGE;//信息
    private final String CONFIRMTEXT;//确认文字
    private final String CANCLETEXT;//取消文字
    private final OnCancleClickListener onCancleClickListener;//取消的点击事件
    private final OnConfirmClickListener onConfirmClickListener;//确认的点击事件

    public interface OnConfirmClickListener{
        void onClick(View view);
    }
    public interface OnCancleClickListener{
        void onClick(View view);
    }

    //构造方法,其实这儿可以直接传一个builder过来的,就像OKHttp的构造方法一样
    private CommonAlertDialog(@NonNull Context context, String TITLE, String MESSAGE, String CONFIRMTEXT, String CANCLETEXT,
                             OnCancleClickListener onCancleClickListener, OnConfirmClickListener onConfirmClickListener) {
        super(context,R.style.AlertDialogUtil);
        this.TITLE = TITLE;
        this.MESSAGE = MESSAGE;
        this.CONFIRMTEXT = CONFIRMTEXT;
        this.CANCLETEXT = CANCLETEXT;
        this.onCancleClickListener = onCancleClickListener;
        this.onConfirmClickListener = onConfirmClickListener;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.view_common_dialog);
        initView();
    }
    public static Builder Builder(Context context){
        return new Builder(context);
    }
    private void initView() {
        Button btnConfirm = findViewById(R.id.btn_confirm);
        Button btnCancel = findViewById(R.id.btn_cancel);
        TextView tvTitle = findViewById(R.id.tv_title);
        TextView tvMessage = findViewById(R.id.tv_message);

        if (!TextUtils.isEmpty(TITLE)) {
            tvTitle.setText(TITLE);
        }
        if (!TextUtils.isEmpty(MESSAGE)) {
            tvMessage.setText(MESSAGE);
        }
        if (!TextUtils.isEmpty(CONFIRMTEXT)) {
            btnConfirm.setText(CONFIRMTEXT);
        }
        if (!TextUtils.isEmpty(CANCLETEXT)) {
            btnCancel.setText(CANCLETEXT);
        }
        btnConfirm.setOnClickListener(v -> {
            if(null != onConfirmClickListener){
                onConfirmClickListener.onClick(v);
            }
            dismiss();
        });
        btnCancel.setOnClickListener(v -> {
            if(null != onCancleClickListener){
                onCancleClickListener.onClick(v);
            }
            dismiss();
        });
    }
    public CommonAlertDialog shown(){
        show();
        return this;
    }
    //创建Builder类
    public static class Builder{
        private String mTitle;
        private String mMessage;
        private String mConfirmText;
        private String mCancelText;
        private OnConfirmClickListener mOnConfirmClickListener;
        private OnCancleClickListener mOnCancleClickListener;
        private Context mContext;

        private Builder(Context mContext) {
            this.mContext = mContext;
        }

        public Builder setTitle(String title){
            this.mTitle = title;
            return this;
        }
        public Builder setMessage(String message){
            this.mMessage = message;
            return this;
        }

        public Builder setConfirmText(String mConfirmText) {
            this.mConfirmText = mConfirmText;
            return this;
        }

        public Builder setCancelText(String mCancelText) {
            this.mCancelText = mCancelText;
            return this;
        }

        public Builder setOnConfirmClickListener(OnConfirmClickListener mOnConfirmClickListener) {
            this.mOnConfirmClickListener = mOnConfirmClickListener;
            return this;
        }

        public Builder setOnCancleClickListener(OnCancleClickListener mOnCancelClickListener) {
            this.mOnCancleClickListener = mOnCancelClickListener;
            return this;
        }
        //build时返回dialog对象,就是从这儿创建的对象
        public CommonAlertDialog build(){
            return new CommonAlertDialog(mContext,mTitle,mMessage,mConfirmText,mCancelText,
                    mOnCancleClickListener,mOnConfirmClickListener);
        }
    }
}

使用时就非常简单了,如下例子,我只想要设置消息文字和设置确认时的点击事件就好,相当简单

CommonAlertDialog.Builder(getSelfActivity())
                 .setMessage("是否确定删除该用户?")
                 .setOnConfirmClickListener(new CommonAlertDialog.OnConfirmClickListener() {
                     @Override
                     public void onClick(View view) {
                         。。。。。。 
                      }
                   })
                 .build()//此时返回的已经是CommonAlertDialog的对象了
                 .shown();//调用dialog的shown显示

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值