设计模式:Android AlertDialog的builder(建造者模式)

来源:互联网 发布:淘宝里的极有家是什么 编辑:程序博客网 时间:2024/06/05 13:32

最近,公司一个大牛问了个问题,Android中的AlertDialog的创建方法AlertDialog.Builder 是什么形式,有什么好处?
所以,最近一直都在看设计模式。
然后自己一点总结,在此记录一下:

建造者模式

将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。

建造者模式的具体介绍,请移步我的上一篇blog 设计模式:Java 建造者模式(Builder)
在此就不多做介绍了,本文主要说的是Android的AlertDialog

建造者模式通常包括下面几个角色:

  1. builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。

  2. ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。

  3. Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

  4. Product:要创建的复杂对象。

具体如下图:
建造者模式

通过前文知道,一般建造者模式,都是把一系列具有共同属性、不同表现形式的对象抽象出来,通过一个接口 builder 来规定其所具有的属性。然后通过指导者 Director 来把builder 中的属性安装一定的规则组装起来。
我们事先需要把 接口builder和领导者 Director 定义好。
然后每当有具备此属性的新的实例的话,只需要写其基于builder的实现类,来设定其各种属性,而不需要再去实装一遍。

但是,Android中的AlertDialog中的Builder,并不是这种实现方式。
通过源码看以看出,AlertDialog中的Builder是一个内部类。

我们可以这样理解:

  1. AlertDialog中的Builder也对应 构建者模式的builder,他同样规定了,这个对象所具有的属性。

  2. 然后AlertDialog中的AlertController对应构建者模式的 Director,其中AlertController.AlertParams 记录了Builder中的所有属性,然后通过AlertDialog的构造方法实现了对象的构造

那么两种方式有什么不同呢?

  1. 实现接口的形式,接口中定义的方法,其实现类都必须实现。而且,实现类可以定义自己的方法。这样构建出来的所有Builder都不是同一个类的对象。并且都具有一部分相同的必须属性和一部分私有的属性。(这里属性,对应的是接口中的方法)。但是,内部类的形式,因为我们每次都是去实例化一个内部类的对象,所以,每一个构建出的Builder都是同一个类的对象,都具有相同的属性,但是可以根据我们自己的选择来设置不同的属性,然后在Director中根据属性的不同来显示不同的形式。

  2. 实现接口的形式,其创建,是把对应的Builder传入Director 去创建,然后在builder中提供一个公有的方法,来返回创建完成的对象。而内部类的形式,是实例化一个内部类Builder的对象,然后设置我们需要的属性,最后通过内部类的一个公有方法返回一个外部类的对象。

这只是自己的一点见解,比较肤浅,希望有幸看到这篇文章的人,可以提出问题,大家共同进步。

0 0