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

结果:
Builder模式及其在Android中的使用_第1张图片

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

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

更多相关文章

  1. 【Android】adb connect 手机的两种方式
  2. 什么是Android上的USB调试模式以及如何启用它?
  3. Android Bitmap的常用压缩方式
  4. Android Recovery模式学习体会
  5. Android实现XML解析的三种方式
  6. Android实现关机和重启的几种方式
  7. android 将app添加进入文件的打开方式
  8. 浅谈Android移动架构(一)创建型模式之工厂模式
  9. android 数据储存——--SQLite存储方式(3)

随机推荐

  1. Android创建和使用数据库详…
  2. EditText横屏时,弹出软件盘时不进行全屏
  3. [Java][Android][Process] 暴力的服务可
  4. android 布局中 layout_gravity、gravity
  5. Android面试题收集(有具体答案)
  6. Android及Robotium学习总结【环境…
  7. Android(安卓)自定义View及其在布局文件
  8. Android(安卓)服务器推送技术
  9. Dojo Mobile:iPhone/Android的Web应用开发
  10. Android开发之Android是什么