您的位置:首页 > 产品设计 > UI/UE

Android--Builder模式

2017-06-27 18:36 134 查看
      这次来说说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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息