文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

深入理解Android中的建造者模式

2022-06-06 07:21

关注

前言

在Android开发过程中,我发现很多安卓源代码里应用了设计模式,比较常用的有适配器模式(各种adapter),建造者模式(Alert Dialog的构建)等等。虽然我们对大多数设计模式都有所了解,但是在应用设计模式的这个方面,感觉很多人在这方面有所不足。所以这篇文章我们一起深入的理解Android中的建造者模式。

建造者模式(Builder Pattern)也叫生成器模式,其定义如下:

separate the construction of a complex object from its representation so that the same construction process can create different representations.将一个复杂对象的构建与它的标示分离,这样的话就可以使同样的构建过程可以创建不同的表示。

我的理解:就是把一个产品(对象)表示(展示)和构建(创建)过程分离开来,这样产品的构建流程相同却可以有不同的产品表示。

应用场景

这里举出Android中常见的例子:

android中的AlertDialog对话框的构建过程就是建造者模式的典型应用。


看一下Builder源码


 public static class Builder {
  private final AlertController.AlertParams P;
  public Builder(Context context) {
    this(context, resolveDialogTheme(context, 0));
  }
  public Builder(Context context, int themeResId) {
    P = new AlertController.AlertParams(new ContextThemeWrapper(
        context, resolveDialogTheme(context, themeResId)));
  }
  //各种set参数方法
  setTitle()
  ...
  ...
  ...
  
  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);
    dialog.setCancelable(P.mCancelable);
    if (P.mCancelable) {
      dialog.setCanceledOnTouchOutside(true);
    }
    dialog.setOnCancelListener(P.mOnCancelListener);
    dialog.setOnDismissListener(P.mOnDismissListener);
    if (P.mOnKeyListener != null) {
      dialog.setOnKeyListener(P.mOnKeyListener);
    }
    return dialog;
  }
  // 这个show方法是builder对象的,里面封装了create()和show()可以直接调取创建并显示对话框
  public AlertDialog show() {
    final AlertDialog dialog = create();
    dialog.show();
    return dialog;
  }
}

分析源码可以看到内部类

Builder
是用来构建这个对话框的:

    1、创建

builder
的时候,会把这个
AlertController.AlertParams P;
对象P创建new出来

    2、在对

bilder
设置各种参数的时,这些参数都存在了对象P中

    3、然后

builder
参数设置完毕后在调用
create
方法。


final AlertDialog dialog = new AlertDialog(P.mContext, 0, false);
P.apply(dialog.mAlert); // mAlert是外部类中的

这个方法中会首先调用外部类

AlertDialog
的构造方法,
new
出一个外部类对象,然后
p.apply()
方法会将P这个对象作为内部类的属性赋值给
AlertController
的对象
mAlert
。这样就完成了一次的构建。

下面是AlertDialog的部分源码


public class AlertDialog extends Dialog implements DialogInterface {
  // 这个对象用来承接builder内部所设置的参数
  private AlertController mAlert;
  //以下几个构造方法决定只能通过内部类builder来构建
  protected AlertDialog(Context context) {
    this(context, 0);
  }
  protected AlertDialog(Context context, boolean cancelable,   OnCancelListener cancelListener) {
    this(context, 0);
    setCancelable(cancelable);
    setOnCancelListener(cancelListener);
  }
  protected AlertDialog(Context context, @StyleRes int themeResId) {
    this(context, themeResId, true);
  }
  AlertDialog(Context context, @StyleRes int themeResId, boolean createContextThemeWrapper) {
    super(context, createContextThemeWrapper ? resolveDialogTheme(context, themeResId) : 0,
      createContextThemeWrapper);
    mWindow.alwaysReadCloseOnTouchAttr();
    mAlert = new AlertController(getContext(), this, getWindow());
    }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对各位Android开发者们能有所帮助,如果有疑问大家可以留言交流。

您可能感兴趣的文章:java设计模式之建造者模式学习php设计模式 Builder(建造者模式)C++设计模式之建造者模式JavaScript设计模式之建造者模式介绍Java运用设计模式中的建造者模式构建项目的实例解析JS建造者模式基本用法实例分析深入理解JavaScript系列(27):设计模式之建造者模式详解Java设计模式之建造者模式(Builder模式)介绍深入解析Python设计模式编程中建造者模式的使用iOS App设计模式开发中对建造者模式的运用实例


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯