[关闭]
@Tyhj 2019-01-29T15:28:49.000000Z 字数 1659 阅读 877

Builder模式

设计模式


定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

使用场景

  • 相同的方法,不同的执行顺序,产生不同的结果
  • 多个部件或零件,都可以装配到一个对象中,但是产生的结果不一样
  • 初始化的对象很复杂,参数多,很多都有默认值的时候

理解

构造者(建造者)模式,既然是构造而不是生产,就说明我们需要对构造的参数、顺序进行设定,来构造出想要的对象;方便用户创建复杂的对象,使用者不需要关心构建的内部细节,将构建的过程和部件解耦;将对象构建过程和细节进行封装和复用

举个栗子

网上已经有很多简单的实现例子,都是比较标准的构建者模式;这里举一个实际项目中的栗子;在Android APP中,一般会有一些弹窗来提示用户比如获取权限、提示出错、等待什么的,一般来说风格都是一样的,有固定的几种按键,固定的几种布局;

未标题-2.jpg-30.3kB

对于一些弹窗很多的APP来说,每次有一个不一样的弹窗就写一个布局(即使是复制代码),需要初始化控件,设置风格、设置字体、设置点击事件,可以想象一大堆代码,非常麻烦,代码都不想贴了;

  1. inputView = new DialogBuilder(getContext())
  2. .setTitleTxt("输入操作数量")
  3. .setRightBtnTxt("取消")
  4. .setLeftBtnTxt("确定")
  5. .setLeftClickListener(listener)
  6. .openAutoCancle()
  7. .create();

使用构建者模式,可以实现一行代码就初始化完一个弹窗,事情就简单多了嘛,当我设置了不一样的值进去,得到的结果不一样,也不需要关心内部的构建细节;你完全可以在布局上添加各种控件,默认隐藏,当控件被设置了参数后自动显示,就可以创建出各种各样的弹窗

实现方法

构造者模式的实现方法其实差不多是固定的,就是创建一个Builder对象,通过Builder设置一些参数来构建我们需要的对象;具体写法可能各有不同,偷一张类图展示原生的构造者模式的具体写法

具体的实现

DialogView就是一个我们需要的自定义的View了,在DialogBuilder中要完成几件事,首先需要一个DialogView对象用来返回,在构造函数中初始化;因为自定义View需要一个Context对象,所以这里传入一个Context

  1. /**
  2. * 弹窗
  3. */
  4. private DialogView mDialogView;
  5. public DialogBuilder(Context context) {
  6. mDialogView = new DialogView(context);
  7. }

然后为DialogView设置各种参数,继续返回DialogBuilder对象,来形成一个链式调用;

  1. /**
  2. * 设置标题
  3. *
  4. * @param titleTxt
  5. * @return
  6. */
  7. public DialogBuilder setTitleTxt(String titleTxt) {
  8. mDialogView.setTitleTxt(titleTxt);
  9. return this;
  10. }
  11. /**
  12. * 设置中间的内容
  13. *
  14. * @param contentTxt
  15. * @return
  16. */
  17. public DialogBuilder setContentTxt(String contentTxt) {
  18. mDialogView.setContentTxt(contentTxt);
  19. return this;
  20. }
  21. ...

最后还有一个create方法,返回需要的DialogView对象

  1. /**
  2. * 创建View
  3. *
  4. * @return
  5. */
  6. public DialogView create() {
  7. return mDialogView;
  8. }

其实这个东西和Android弹窗AlertDialog.Builder其实差不多的,都去掉了Director类;但是我这里没有抽象出Builder接口来,因为和AlertDialog.Builder不一样,想要定义出更多样式的弹窗,又不想花太多时间,而且只在一个项目中使用,所以没有去抽象出接口,可能对于拓展不是很友好,但是目前够用了,不够用了再去重构;

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注