• 【设计模式】Builder


    前言

    Builder设计模式,允许一步一步构建一个复杂的对象。将构建步骤抽象出来,让每个具体的Builder去实现构建步骤的内容。这样子就可以用同样的构建步骤,构建出不一样的对象。在Director类的协助下,可以将固定的构建步骤封装起来,给Director一个Builder,让Director来调用Builder的具体构建步骤。

    变的是什么呢?构建步骤的具体内容
    不变的是什么呢?

    分析

    见到Builder设计模式,更多时候Director就是你自己!你需要自己去调用Builder的构建步骤去构建想要的对象。这么做的好处是隐藏了细节,很多细节调用者并不关心,这些细节都是一样的,那么将他们封装到具体的函数中,调用者给出最少需要的信息即可。

    适用场景

    当一个类的构造函数需要的参数过多的时候,可以考虑使用Builder设计模式。

    源码分析

    AlertDialog.Builder

    为什么说Builder的好处之一是隐藏细节呢?请看setTitle这个函数。

    当使用Builder调用这个setTitle函数的时候,调用方只需要给出titleId,Builder调用Context的方法获取String,然后将之存到AlertParams中。这只是其中的一个例子。其他的比如,输入信息,Builder去new一个对象,然后设置AlertParams。这些查字符串,创建对象等操作,只需要调用者给出信息即可在背后完成。

    最后调用create()或者show()来创建一个AlertDialog,根据AlertParams的参数去设置AlertDialog,然后调用AlertParams.apply设置它的AlertController。

    自己实现Builder的时候,可以参考它的做法,返回this,可以连在一起setXXX。

    AlertDialog.java下面的Builder类
    
    private final AlertController.AlertParams P;
    
    public Builder setTitle(@StringRes int titleId) {
        P.mTitle = P.mContext.getText(titleId);
        return this;
    }
    
    public AlertDialog create() {
        // Context has already been wrapped with the appropriate theme.
        final AlertDialog dialog = new AlertDialog(P.mContext, 0, false);
        P.apply(dialog.mAlert);
        ...
        return dialog;
    }
    
    AlertController.java下面的AlertParams类
    
    public void apply(AlertController dialog) {
        ...
        if (mMessage != null) {
            dialog.setMessage(mMessage);
        }
        if (mPositiveButtonText != null) {
            dialog.setButton(DialogInterface.BUTTON_POSITIVE, mPositiveButtonText,
                    mPositiveButtonListener, null);
        }
        ...
    }
    

    Director

    这里想到了一个强行应用Director的例子。在一个Activity中,有几个创建AlertDialog的过程,这些过程除了SetMessage不一样之外,其他部分都一样。如果确定了这些AlertDialog的风格一致,除了Message不一样,可以创建一个Director类,传入一个Builder,传入要显示的String,让Director来指挥Builder干活。

    确保是在真的大量重复创建风格相同的AlertDialog的前提下使用。至于好处嘛,比如当要更改ALertDialog的风格,每一个都要去做修改。如果使用了Director,只要告诉Director你该怎么改,岂不是美滋滋。

  • 相关阅读:
    android开发中提示:requires permission android.permission write_settings解决方法
    TRX(腾讯通)与OA集成
    windows下Tomcat指定jdk并部署到系统服务设置开机启动
    如何配置Tomcat服务器环境
    IntelliJ IDEA 工具使用
    AOP切面操作
    Spring Boot中使用AOP面向切面
    sun.misc jar包
    Excel导出数据库数据
    FreeMarker js 获取后台设置的request、session
  • 原文地址:https://www.cnblogs.com/zzk0/p/11223191.html
Copyright © 2020-2023  润新知