Android--Builder模式


      这次来说说Builder模式。


      在Android中,我们需要在UI上面弹出一个dialog,经常会写如何代码:

 

private  void showdialog(){
    new AlertDialog.Builder(SecondAcy.this)
    .setMessage("This is a dialog")
    .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            //do what you want to do
        }
    })
    .create().show();
}
   这里就是我们常见的Builder模式了。

    本来是想show一个dialog的,为什么是new一个AlertDialog.Builder呢?而不是直接new AlertDialog呢,当然也不是不可以,不过我们这种方法隐藏了dialog的内部实现,我们不需要去关心里面的实现,而且这种链式代码会显得代码逻辑结构特别清晰。


  点进去源码里面我们发现,Builder其实就是AlertDialog的一个内部类。


   我们来看看create()里面做了什么:

 



 //通过setMessage传进去的参数最终赋给了AlerDialog.其余属性也类似
public Builder setMessage(CharSequence message) {
    P.mMessage = message;
    return this;
}

  //可以看到,create()里面其实就是new AlertDialog()的过程,而dialog的属性也是由调用者通过builder
  来传进来

public AlertDialog create() { // Context has already been wrapped with the appropriate theme. final AlertDialog dialog = new AlertDialog( P.mContext , 0 , false) ; P.apply(dialog.mAlert) ; dialog.setCancelable( P.mCancelable) ; if ( P.mCancelable) { dialog.setCanceledOnTouchOutside( true) ; } dialog.setOnCancelListener( P.mOnCancelListener) ; dialog.setOnDismissListener( P.mOnDismissListener) ; if ( P.mOnKeyListener != null) { dialog.setOnKeyListener( P.mOnKeyListener) ; } return dialog ;}


  这是Android里面比较典型的一个Builder模式的例子,那么Builder模式究竟是一种什么模式呢?

  介绍:builder模式主要是为了将对象的内部构建和部件进行解耦,使得构建和部件的表示隔离开,比如需要组装一个机器人,而这个过程很复杂,而很琐碎,对于使用者来说,他并不关心这个过程,也不需要知道具体的过程,他只需要告诉组装机器的人员他的需求即可,比如颜色、高度等属性。使用Builder模式可以将这两个过程分离,两者之间的耦合度降到最低。

  常用场景:当我们编写的某些bean类参数非常多时,一般我们会选择构造函数传参或者set()方法,但是参数太多会导致代码难以维护和臃肿,Builder模式就能够让代码看起来更加简洁。

 以下一个非常简单的例子,仅做介绍:

package com.example;


//属性繁多,内部实现复杂的bean类,(这里的属性没有设置太多,省略里面一些计算过程,实际项目中
    应该比较多类似的情况)
public class BuilderModel {


    private  String name;
    private  int age;
    private  String  province;
    private  int  height;
    private  int weight;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getWeight() {
        return weight;
    }


    public void setWeight(int weight) {
        this.weight = weight;
    }


   /**将一些比较复杂的计算过程和属性的表示解耦,对调用者隐藏实现细节*/
    private   void caculateHelth(){
        //do some  complex caculation
    }



  /**Builder可以做成BuilderModel的内部类*/
    public  static  class Builder{
        public  BuilderModel model=new BuilderModel();

      public  Builder(){

      }

        public Builder buildWeight(int w) {
           model.setWeight(w);
            return  this;
        }


        public Builder buildName(String name) {
            model.setName(name);
            return  this;
        }


        public Builder buildAge(int age) {
            model.setAge(age);
            return  this;
        }

        public Builder buildProvince(String province) {
            model.setProvince(province);
            return  this;
        }

        public  BuilderModel create(){
            return  model;
        }

    }



}

  那么这样实现之后,调用就会变得非常简单:

 

new BuilderModel.Builder().buildName("de").buildWeight(92).buildAge(20).buildProvince("GD").create();

猜你喜欢

转载自blog.csdn.net/qq_26984087/article/details/73821785