Builder模式及其在Android中的使用

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();
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值