android使用Java设计模式建造者模式(Builder模式)的写法:

建造者模式的定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
这里給大家分析一下:
定义的前半句说,构造与表示分离,其实就是继承(或实现)。
两种工厂模式也都是为某个对象提供一个接口,而且无需指定它们的具体类。
所以建造者模式的重点是后半句:同样的构建过程可以创建不同的结果。
但是我仔细想了一下,这句话说的也是太含糊了,并且和工厂模式也是类似的,工厂模式的接口也是定义了产品的过程,子类去实现,然后生产出不同的产品。
虽然是有点纠结但是还是应该先看完,在慢慢来深入理解这个建造者模式。

建造者模式中,有如下四种角色:

1.抽象建造者(Builder):该绝是用于规范产品的各个组成部分,并进行抽象,一般独立于应用程序的逻辑。

2.具体建造者(Concrete Builder):该角色实现抽象建造者中定义的所有方法,并且返回一个组件好的产品实例。

3.产品(Product):该角色是建造者中的复杂对象,一个系统中会有多个产品类,这些产品类不一定有共同的接口,可以是完成不相关的。

4.导演者(Director):该角色负责安排已有模块的顺序,然后告诉Builder开始建造

建造者模式的类图:

这里写图片描述

下面以自定义Dialog 为例

public class CursorDialog extends Dialog {


    public CursorDialog(@NonNull Context context) {
        super(context);
    }

    public CursorDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
    }



}

需要在方法里创建一个内部类

public class CursorDialog extends Dialog {


    private CursorDialog(@NonNull Context context) {
        super(context);
    }

    private CursorDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
    }

//内部类   能在下面返回 上面的方法就私有化了
    public static class Builder {

        private final Context mContext;

        //参数 在這寫一些Dialog的參數 不全屏 


        public Builder(Context context) {
            mContext = context;
        }

        public CursorDialog builder() {


            return new CursorDialog(mContext);
        }

    }

}

最后成型:

public class CursorDialog extends Dialog {

    private CursorDialog(Context context) {
        super(context);
    }

    private CursorDialog(Context context, int themeResId) {
        super(context, themeResId);
    }







    public static class Builder {

        private final Context mContext;
        //参数
        //是否全屏 默认不全屏
        private boolean isFloating = true;//浮动 窗口化
        private String title;//flase
        private boolean isFull;
        private View layout;


//设置布局
        public Builder setLayout(int res) {
            layout = View.inflate(mContext, res, null);
            return this;
        }

        public Builder setViewClick(int id, View.OnClickListener listener) {
            View view = layout.findViewById(id);
            view.setOnClickListener(listener);
            return this;
        }

        public Builder setViewClick(int id, AdapterView.OnItemClickListener listener) {
            View view = layout.findViewById(id);
            if (view instanceof AdapterView) {
                AdapterView v = (AdapterView) view;
                v.setOnItemClickListener(listener);
            }
            return this;
        }


        public Builder setView(View v) {
            layout = v;
            return this;
        }

        public Builder notFloating() {
            isFloating = false;
            return this;
        }

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

        public Builder full() {
            isFull = true;
            isFloating = false;
            return this;
        }


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


        public CursorDialog builder() {
            CursorDialog dialog;
            if (isFloating) {
                //浮动的
                if (TextUtils.isEmpty(title)) {
                    dialog = new CursorDialog(mContext, R.style.CursorDialogThemeNotTitle);
                } else {
                    dialog = new CursorDialog(mContext);
                }
            } 

            if (layout == null)
                throw new IllegalArgumentException("view不能为空");
            dialog.setContentView(layout);
            return dialog;
        }

    }
}

调用

Dialog  dialog = new CursorDialog.Builder(this).setLayout(R.layout.dialog_updata).notFloating().builder();

//此外需要自己写对应的style

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值