Android-AlertDialog为什么用builder类创建对象
2015-12-03 00:00
405 查看
最近看一些android的代码,发现他的AlertDialog是需要用类似下面的代码来创建的:
进入到AlertDialog的源代码,可以看到AlertDialog是继承于Dialog,并且他的构造函数都是声明成protected的。而Builder是一个内部的public static class. Builder的大部分方法是在设置一个AlertController.AlertParams 的object.只有在调用Builder.create或者show的时候(其实show也是先调用了create),才会真正的new一个AlertDialog的对象,并且把AlertParams的某些参数设置给这个AlertDialog对象。
但是我始终没想明白这样做会带来什么特别的效果或者说好处。只是为了结构上看起来稍微清晰一点?还是有深层次的含义呢?
结论:这是一个builder模式构建复杂对象的应用。在Builder.create中,或者在params的设置中,就能够实现对AlertDialog本身的约束规则。AlertDialog声明protected的构造函数就防止了外部代码不通过build而直接去new对象,造成约束失败的情况。
new AlertDialog.Builder(this) .xxxx
进入到AlertDialog的源代码,可以看到AlertDialog是继承于Dialog,并且他的构造函数都是声明成protected的。而Builder是一个内部的public static class. Builder的大部分方法是在设置一个AlertController.AlertParams 的object.只有在调用Builder.create或者show的时候(其实show也是先调用了create),才会真正的new一个AlertDialog的对象,并且把AlertParams的某些参数设置给这个AlertDialog对象。
但是我始终没想明白这样做会带来什么特别的效果或者说好处。只是为了结构上看起来稍微清晰一点?还是有深层次的含义呢?
结论:这是一个builder模式构建复杂对象的应用。在Builder.create中,或者在params的设置中,就能够实现对AlertDialog本身的约束规则。AlertDialog声明protected的构造函数就防止了外部代码不通过build而直接去new对象,造成约束失败的情况。
相关文章推荐
- druid 1.0.16数据库密码加密
- RequireJS
- OpenCV - Mac上使用HighGUI
- Mathematics:Ultra-QuickSort(POJ 2299)
- 下拉刷新和UITableView的sectionHeaderView冲突的问题
- UI设计
- iOS之UI--Quartz2D的入门应用--重绘下载圆形进度条
- 1051. Pop Sequence (25)
- UESTC 1024 Flying Chess 注意那个 1<x<N 不是1<=x<N 模拟
- 【UI进阶】UIAlertController替代UIAlertView和UIActionSheet
- Android bluetooth开发
- 使用js获取QueryString的方法小结
- 技能UP:SAP OBYC自动记账的实例说明(含value String应用说明)
- 关于队列queue
- scrollview嵌套listview,listview不滚动问题
- APUE:信号 - 未决信号与信号阻塞
- UI基础2控件:UILabel,UIImageView
- Thread lock_guard 和 unique_lock
- UI_通讯录
- HDU 3397 Sequence operation