当Android遇上设计模式之建造者(Builder)模式

本文从Android开发者的角度深入探讨Builder模式,通过实例解析Builder模式的原理,包括UML类图和时序图。并以AlertDialog为例,展示了在Android项目中如何运用Builder模式创建和定制Dialog,强调了Builder模式在复杂对象构建中的优势及其适用场景。
摘要由CSDN通过智能技术生成

转载请声明出处:https://blog.csdn.net/AndrExpert/article/details/79665082

众所周知,无论是大部分书籍还是博客,对设计模式的介绍也仅表现在简单的java举例层面,虽然是看懂了,但是在开发的过程中就是不知道如何应用到项目中,时间久了也容易忘记。因此从今天开始,我计划从Android开发者角度写一些关于设计模式系列文章,希望通过这个系列的文章我们不仅能够理解这些设计模式的原理,更能够将其应用到我们的实际项目中。

一、Builder模式原理剖析

 Builder,译为”建造者”,我们可以很容易联想想到建筑工人建房子,其大概的流程由打地基、修建主体框架、装修等部分组成,且每个部分是由不同的建筑工人完成。虽说不同的建筑工人修建的风格不一样,但是只要按照上述的修建流程,就能够得到一栋完整的房子,这就是传说中的Builder模式!

1. Builder模式

 所谓建造者(Builder)模式,即将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。通俗一点理解,该模式是为了将构建复杂对象的过程和它的部件解耦,使用构建过程和部件都可以自由扩展,同时对外部(客户端)隐藏实现细节,客户端只需调用相同的构建过程,就可以得到不同的产品(对象)。
根据Builder模式理论,以上述建房子为例,房子为要构建的复杂对象(Product),”打地基-修建主体框架-装修”为构建过程(Director),”打地基”、”修建主体框架”、”装修”为构建对象的部件(Builder),可以看出构建过程与它的部件是相互独立的,而对于业主来说,他无法(无需)知道修建的整个流程和每个部分的具体细节,只需要事先告诉建筑工人哪里用什么材料或怎么设计,就可以得到他预想中的房子,并且每个部分建筑工人还可以加入他自己的idea,业主最终可以获取风格不同的房子。

2. UML类图

 根据Builder模式的定义,可以得到该模式的UML类图,有以下几个角色:

image
- (1) Builder:抽象Builder类,规定产品有那些部件,且部件的具体实现由其子类实现;
- (2) ConcreteBuilder:Builder子类,产品部件的具体实现;
- (3) Director:规定构建对象的过程;
- (4) Product:具体产品类;

 从UML类图可知,Builder和Director为聚合关系,Director类持有Builder的引用用于调用创建部件相关方法,而Builder是可以脱离Director而单独存在的,即它们是相互独立的;ConcreteBuilder和Builder为继承关系,前者继承于后者,且是后者的具体实现;ConcreteBuilder依赖于Product,ConcreteBuilder持有Product的引用才能完成其工作。

3. 时序图

image

二、Android项目实战

 在Android源码中,建造者(Builder)模式应用非常广泛,比较经典的就是AlertDialog内部实现,它就是通过Builder对象来组装Dialog的各个部分,如title、Message、Button等,将Dialog的构造和表示进行分离。因此,为了进一步理解Builder模式,我们在不看AlertDialog源码的情况下,尝试着根据Builder模式的原理来实现Dialog的创建。该项目的UML类图如下:

image

  • Builder,建造者抽象类。
    Builder类是建造者抽象类,该类规定了一个Dialog对象由图标、标题、内容、Button操作部件组成,并提供相关的抽象方法。代码如下:
/**Builder,建造一个Dialog对象的各个部分(部件)的抽象接口
 * Created by jianddongguo on 2018/3/4.
 */
public abstract class Builder {
   
    // 图标
    public abstract void setIcon(int id);
    // 标题
    public abstract void setTitle(String title);
    // 内容
    public abstract void setMessage(String[] content);
    // 操作
    public abstract void setOnDialogClickListener(String confirmText,String cancelText,
                 Dialog.OnDialogClickListener listener);
    // 创建Dialog
    public abstract Dialog create();
}
  • AlertDialogBuilder,建造者具体类
    继承于Builder,用于创建一个Dialog对象各个组成部分的具体实现。比如我们需要创建的Dialog类型为提示对话框(AlertDialog),那么对话框的ContentView应该是一个TextView,再给该TextView设置文本。也就是说,随着创建Dialog类型不同,建造者具体类可以不同,比如我们需要创建一个列表对话框,那么ContentView应该是一个ListView,该类的名字改为ListDialogBuilder。
/**
 * Builder具体实现类,用于建造AlertDialog各部件
 * Created by jianddongguo on 2018/3/4.
 */

public class AlertDialogBuilder extends Builder {
   
    private Dialog mDialog = new AlertDialog();
    private Co
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值