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

Builder模式及其在Android中的使用

2018-02-24 16:20 330 查看

Builder模式及其在Android中的使用

本篇blog主要介绍builder模式的概念、demo 以及在Android中的运用等等:

概念

实验demo

Android运用

总结

Builder概念

作为一个开发人员,不论你是初入职场的菜鸟,还是这个领域的专家,在面对复杂多变的组织结构和频繁修改需求时,一个好的设计就显得尤为重要。如果一个类反复修改,我们使用传统的方式,会写很多的构造参数,如果修改的话,涉及到的都要修改,此时会很麻烦,不利于维护和扩展。此时,我们需要一种灵活多变的模式来应对多变的需求,builder模式就是其中一种。builder是对于我们的需求来说,主要架构和脉络不变,只是会改变它的细节(增加或减少),让开发者快速维护的一种模式。

那么写个demo吧。

思路 (模型测试):

写类 :目的就是数据传入,并能分别获取。

传统写法:

Bean:

public class DesignBean implements Serializable {

private static final long serialVersionUID = 2035522819932441426L;

//三个参数 三个方法方便DesignBean获取各个参数

private String builder_name;
private String builder_age;
private String builder_score;

public String getBuilder_name() {
return builder_name;
}

public String getBuilder_age() {
return builder_age;
}

public String getBuilder_score() {
return builder_score;
}

//传参函数
public DesignBean(String builder_name, String builder_age, String builder_score) {

this.builder_name = builder_name;
this.builder_age = builder_age;
this.builder_score = builder_score;

}

//检验数据是否显示正确toString()
public String toString() {

return "姓名: " + builder_name + ",年龄: " + builder_age + ",成绩: " + builder_score;
}

}


测试类:

public class MainActivity extends AppCompatActivity {

TextView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

show = findViewById(R.id.show);

show.setText(new DesignBean("zhangsan","18","80").toString());

}

}


传参看上去有点乱,我们不知参数含义,不够明确。我们把传参这块交给Builder去管理。

改进:

Bean:

/**
* 功能:测试Bean
*/

public class DesignBean implements Serializable {

private static final long serialVersionUID = 2035522819932441426L;

//三个参数 三个方法方便DesignBean获取各个参数

private String builder_name;
private String builder_age;
private String builder_score;

public String getBuilder_name() {
return builder_name;
}

public String getBuilder_age() {
return builder_age;
}

public String getBuilder_score() {
return builder_score;
}

//给Builder提供数据传递的方法
public DesignBean(String builder_name, String builder_age, String builder_score) {

this.builder_name = builder_name;
this.builder_age = builder_age;
this.builder_score = builder_score;

}

public static class Builder {

private String builder_name;
private String builder_age;
private String builder_score;

//链式结构,开放三个参数 三个方法归Builder调用

public Builder addName(String name) {

this.builder_name = name;
return this;
}

public Builder addAge(String age) {

this.builder_age = age;
return this;
}

public Builder addScore(String score) {

this.builder_score = score;
return this;
}

//把Builder获取的数据返给DesignBean,达到目的
public DesignBean create() {

return new DesignBean(builder_name, builder_age, builder_score);
}

}

//检验数据是否显示正确toString()
public String toString() {

return "姓名: " + builder_name + ",年龄: " + builder_age + ",成绩: " + builder_score;
}

}


测试:

public class MainActivity extends AppCompatActivity {

TextView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

show = findViewById(R.id.show);

DesignBean designBean = new DesignBean.Builder().addName("zhangsan").addAge("18").addScore("80").create();
show.setText("一条数据展示>>>\n"+designBean.toString()+"\n--------------------\n详细展示>>>\n姓名:"+designBean.getBuilder_name()+"\n年龄:"+designBean.getBuilder_age()+"\n成绩:"+designBean.getBuilder_score());

}

}


结果:



这种方式下,我们可以清楚每个参数含义。

Android 中可以用来写dialog:

public class BarOrderDialog extends Dialog {

public BarOrderDialog(Context context) {
super(context, R.style.commondialogstyle);
}

public static class Builder {

private Context context;
private OnChangeListener onChangeListener;
private TextView orderbyname01, orderbyname02;
private String name01,name02;

public interface OnChangeListener {
void orderbyname01();
void orderbyname02();

}

public Builder setActionName01(String name01){
this.name01 = name01;
return this;
}

public Builder setActionName02(String name02){
this.name02 = name02;
return this;
}

public Builder(Context context) {
this.context = context;

}

public Builder setOnClickListener(OnChangeListener onChangeListener) {
this.onChangeListener = onChangeListener;
return this;
}

public BarOrderDialog create() {
final BarOrderDialog tiebaDialog = new BarOrderDialog(context);
View view = LayoutInflater.from(context).inflate(R.layout.dialog_bar_order, null);

orderbyname01 = (TextView) view.findViewById(R.id.orderbyname01);
orderbyname02 = (TextView) view.findViewById(R.id.orderbyname02);

orderbyname01.setText(name01);
orderbyname02.setText(name02);

orderbyname01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onChangeListener.orderbyname01();
}
});

orderbyname02.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onChangeListener.orderbyname02();
}
});

Window win = tiebaDialog.getWindow();
win.getDecorView().setPadding(0, 0, 0, 0);
WindowManager.LayoutParams lp = win.getAttributes();
//宽度可从开屏页获取
DisplayMetrics d = context.getResources().getDisplayMetrics(); // 获取屏幕宽、高用
lp.width = (int) (d.widthPixels * 0.7); //0.8*宽
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;

win.setAttributes(lp);
win.setGravity(Gravity.CENTER);
tiebaDialog.setContentView(view);
tiebaDialog.setCanceledOnTouchOutside(true);

return tiebaDialog;

}

}

}


使用时:

if (barOrderDialog == null) {
barOrderDialog = new BarOrderDialog.Builder(TieBaActivity.this).setActionName01("查看方式01").setActionName02("查看方式02").setOnClickListener(new BarOrderDialog.Builder.OnChangeListener() {
@Override
public void orderbyname01() {
// order_text.setText("查看方式01");
// order_text_float.setText("查看方式01");
barOrderDialog.dismiss();
}

@Override
public void orderbyname02() {
// order_text.setText("查看方式02");
// order_text_float.setText("查看方式02");
barOrderDialog.dismiss();
}
}).create();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: