建造者Builder模式在Android端的运用

前言:

在我们移动开发过程中经常看到builder模式的使用,如AlertDialog、okHttp、BottomNavigationView还有Java中的StringBuilder等等,心里面就会出现了一个疑问,使用builder模式有什么好处呢?我翻阅了Java中的builder模式有关文档看到如下解释:建造者模式是使用多个简单的对象一步一步构建成一个复杂的对象,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个Builder类会一步一步构造最终的对象,该Builder类是独立于其他对象的。

举个栗子1:

去超市购物我们可能会买很多东西,比如可乐、薯片、酸奶、还有生活中嘿嘿中使用的AirTT,我们可以认为购物就属于一个建造订单的过程。我们所买的东西顺序是无关的,买什么东西也没什么要求的,可以单个买,也可以多个买,但是最后一定要点确认来完成订单。

public class Order {
    private String coke;
    private String crisps;
    private String milk;
    private String airCondom;

    public Order(Builder builder) {
        this.coke = builder.coke;
        this.crisps = builder.crisps;
        this.milk = builder.milk;
        this.airCondom = builder.airCondom;
    }

    public String getCoke() {
        return coke;
    }

    public void setCoke(String coke) {
        this.coke = coke;
    }

    public String getCrisps() {
        return crisps;
    }

    public void setCrisps(String crisps) {
        this.crisps = crisps;
    }

    public String getMilk() {
        return milk;
    }

    public void setMilk(String milk) {
        this.milk = milk;
    }

    public String getAirCondom() {
        return airCondom;
    }

    public void setAirCondom(String airCondom) {
        this.airCondom = airCondom;
    }


    /**
     * 结算订单
     */
    public void settleOrder() {
       
    }


    public static class Builder {
        private String coke;
        private String crisps;
        private String milk;
        private String airCondom;

        public Builder setCoke(String coke) {
            this.coke = coke;
            return this;
        }

        public Builder setCrisps(String crisps) {
            this.crisps = crisps;
            return this;
        }

        public Builder setMilk(String milk) {
            this.milk = milk;
            return this;
        }

        public Builder setAirCondom(String airCondom) {
            this.airCondom = airCondom;
            return this;
        }

        public Order build() {
            return new Order(this);
        }
    }

    public static void main(String[] args) {
        new Order.Builder()
                .setMilk("牛奶")
                .setCoke("可乐")
                .setCrisps("薯片")
                .setAirCondom("tt")
                .build()//将一些商品构建成一个最终的订单
                .settleOrder();//结算订单
    }
}

那么android中是如何使用它呢?使用的好处是什么?

举个栗子2:

我们开发移动应用中都会用到一些弹框提示如下图

建造者Builder模式在Android端的运用_第1张图片

 

所生成弹框控件代码如下

public class MessageDialog extends Dialog {
    private TextView tvTitle, tvContent;
    private String title, content;
    private long millisecond;

    public MessageDialog(@NonNull Context context) {
        super(context, R.style.fragment_offline_dialog);
    }

    protected MessageDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
    }

    public MessageDialog(Context context, int theme) {
        super(context, theme);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.message_alert);
        tvTitle = findViewById(R.id.text_title);
        tvContent = findViewById(R.id.tv_content);
    }

    public MessageDialog(Builder builder) {
        super(builder.mContext, R.style.fragment_offline_dialog);
        this.title = builder.title;
        this.content = builder.content;
        this.millisecond = builder.millisecond;
    }

    @Override
    public void show() {
        super.show();
        if (!StringUtil.isEmpty(title)) {
            tvTitle.setText(title);
        }
        if (!StringUtil.isEmpty(content)) {
            tvContent.setText(content);
        }
        if (millisecond != 0) {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    dismiss();
                }
            }, millisecond);
        }
    }

    /**
     * @param message
     */
    public void showMessage(String message) {
        if (!isShowing()) {
            this.content = message;
            this.millisecond = 2500;
            show();
        }
    }

    public static class Builder {
        private String title = "温馨提示";
        private String content = "";//提示内容
        private long millisecond = 0;//弹框停留的时间
        private Context mContext;//上下文内容

        public Builder(Context mContext) {
            this.mContext = mContext;
        }

        public Builder setTitle(String title) {
            this.title = title;
            return this;
        }

        public Builder setContent(String content) {
            this.content = content;
            return this;
        }

        public Builder setMillisecond(long millisecond) {
            this.millisecond = millisecond;
            return this;
        }

        public MessageDialog build() {
            return new MessageDialog(this);
        }
    }

}

 最后在你需要提示的地方调用:new MessageDialog.Builder().setContext(this).setTitle("温馨提示").setContent("账号或密码错误!").setMillsecond(2000).build().show();

小结:

可以从上面案例看出建造者模式运用的场景很多,它的优点:1、建造者独立性、易于扩展。2、便于控制细节方面的风险。

也可以看出它的缺点:商品必须要有共同点,范围有限制。2、如内部变化复杂,会有很多的建造类。

 

 

你可能感兴趣的:(建造者Builder模式在Android端的运用)