Android 设计模式(二)建造者模式
目录:
传统的建造者模式
Android中的建造者模式在AlertDialog中的应用
PhoneWindow#setContentView源码简要分析

传统的建造者模式
建造者模式也是常见的一种模式,它主要分成以下几个角色:
抽象产品
具体产品:具体产品是抽象产品的子类
抽象建造者
具体建造者
Director:在Director中持有一个抽象创建者,并且返回一个抽象产品。传入一个具体的创建者并且调用其构建方法可以或返回一个具体的产品的实现。
代码如下:
抽象产品
抽象建造者:
具体产品:
具体构建者:
Director:

建造者模式在Android中的实现:
我们主要通常使用的是构建一个AlertDialog对象,不过构建OkHttpClient也用到了构建者模式。在Android中,AlertDialog将Builder和Director的职能结合,通过在每次setXX返回一个builder实例,实现了一个链式调用的形式:
AlertDialog也是一个window,我们着力在AlertDialog和window上做分析。
AlertDialog的构造函数
可以看到AlertDialog通过AlertController#create构建了一个AlertController的实例。实际上AlertDialog的设计相当好,AlertDialog视图的显示就是通过AlertController这个控制器。
在create中,还通过getWindow传入了一个Window对象:
Window在AlertDialog父类的构造函数中创建了一个PhoneWindow对象,并且获取了WMS。WMS也是上一章分析过的一个从Map容器中获取的单例:

我们回到我们的流程中,去看看内部类Builder相关的实现:
差不多setTitle,setText都是这样的形式。
然后再是Builder#create过程:
因为Alert的视图显示都是交给自身的AlertController,我们主要看看AlertControler.Params#apply:
这里还是一个职能充分解耦的体现,和参数相关的操作都交给AlertController.Params完成。AlertController中的setXXX才是真正的和定义在alert_dialog.xml中的View交互的过程:
mMessageView通过findViewById实例化,然后设置Text,其他的set操作也类似。
Dialog#show
最后的流程就是Dialog#show
show流程大概分成这样的几个部分,使用图表示:

先不看和生命周期流程相关的onCreate和onStart,在onStart之后会从Window中获取DecorView,然后使用WindowManager#addView。WindowManager#addView的过程有点复杂,在这篇文章Android UI体系中有说过,这里不重复。
我们主要现在主要看看dispatchOnCreate。dispatchOnCreate会调用onCreate
AlertController#installContent
这里看到了熟悉的setContentView,在Activity#setContent最后也会调用这里的PhoneWindow#setContentView,这里简要做一个分析:
setContentView主要是installDecor这一步,installDecor包括创建DecorView和mContentParent两个过程,代码调用链如下:

从图中可以看出,DecorView在定义中包括TitleView和ContentView两个部分,ContentView就是我们使用resId填充的部分:

最后是sendShowMessage方法:
showMessage携带的obj就是一个OnShow的回调,disMiss和cancel的回调就是我们设置的