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();
}