【Kotlin设计模式】建造者模式在Android中的应用

news2024/9/20 14:29:37

前言

建造者模式(Builder Pattern)是一种创建型设计模式,一步一步地构建一个复杂对象的不同部分,而不是直接创建该对象的实例。建造者模式的核心思想是将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

具体来说,构建者模式使用一个独立的构建器(Builder)类来封装对象的构建过程。构建器类提供一系列方法来设置对象的属性,并最终返回构建好的对象。这种方式可以避免使用多个构造函数或过多的参数,使得对象的构建过程更加直观和易于扩展。


应用

Android中,也有很多组件和库中使用到了建造者模式,比如原生AlertDialogRetrofitNotificationCompat等。

AlertDailog中应用:


val builder = AlertDialog.Builder(this)
builder.setTitle("设计模式")
       .setMessage("这是建造者模式吗")
       .setPositiveButton("是的") { dialog, _ -> dialog.dismiss() }
       .setNegativeButton("不是") { dialog, _ -> dialog.dismiss() }
       .create()
       .show()
       

Retrofit中应用:


val retrofit = Retrofit.Builder()
    .baseUrl("https://blog.csdn.net/ho")
    .addConverterFactory(GsonConverterFactory.create())
    .build()

val apiService = retrofit.create(ApiService::class.java)

从上述例子可以看出,建造者模式的写法比较清晰,比如AlertDailog中的builder对象采用链式调用setTitlesetMessage等方法,我们就仿照AlertDailog使用Kotlin来实现下建造者模式。

在这里插入图片描述


package com.ho.csdn.widget

import android.app.Dialog
import android.content.Context
import android.graphics.Bitmap
import java.lang.IllegalArgumentException


class StudentPickDialog(context: Context) : Dialog(context) {

    private var mId: Long = 0L

    private var mAvatar: Bitmap? = null

    private var mName: String = ""

    private var mAge: Int = 0

    private constructor(
        context: Context,
        id: Long,
        avatar: Bitmap?,
        name: String,
        age: Int
    ) : this(context) {
        mAvatar = avatar
        mId = id
        mName = name
        mAge = age
    }

    companion object {

        fun init(context: Context): Builder {
            return Builder(context)
        }
    }


    data class Builder(private val mContext: Context) {

        private var mId: Long = 0L

        private var mAvatar: Bitmap? = null

        private var mName: String = ""

        private var mAge: Int = 0

        /**
         * 设置id
         */
        fun setId(id: Long) = apply {
            this.mId = id
        }

        /**
         * 设置头像
         */
        fun setAvatar(avatar: Bitmap) = apply {
            this.mAvatar = avatar
        }

        /**
         * 设置名称
         */
        fun setName(name: String) = apply {
            this.mName = name
        }

        /**
         * 设置年龄
         */
        fun setAge(age: Int) = apply {
            this.mAge = age
            if (mAge > 150) {
                throw IllegalArgumentException("年龄超过了限制")
            }
        }

        fun build() = StudentPickDialog(mContext, mId, mAvatar, mName, mAge)
    }
}

这里自定义Dailog显示选择某一学生信息做展示,建造者模式部分如下,新建StudentPickDialog继承Dialog,在类内部新建Builder类,创建setAvatarsetNamesetAge且返回Builder对象,外部创建了Builder对象后就可以链式调用方法了。

这里使用到了Kotlin的apply扩展函数,函数返回调用它的对象本身的特性。

新建build()方法,返回StudentPickDialog对象,将Id、名字、头像、年龄作为构造参数传入,调用如下。


   StudentPickDialog
          .init(requireContext())
          .setId(92229)
          .setAvatar(detectBitmap!!)
          .setName("Ho")
          .setAge(30)
          .build()
          .show()
          

总结

Android 中,建造者模式被广泛应用于需要配置多个选项、步骤复杂或构建过程不容易一步完成的场景。通过建造者模式,可以更轻松地创建和配置复杂对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2072596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用ssm实现基于ssm的疫情物质管理系统

TOC ssm170基于ssm的疫情物质管理系统jsp 第一章 绪论 1.1 研究背景 时代总是在进步的,自从进入了信息时代,面对大量的不同种类的数据,仅仅依靠有限的人力去处理,显然是不行的,毕竟人工处理大量的数据会耗费较长时…

git提交项目,报403无权限

这个在公司内网git上提交项目时,使用的是刚分配到的账号和密码。创建完组和项目后一切准备完毕了,但是在提交时缺出了乌龙,报403,上面一堆英文,大致的意思是说我没有上传本项目的权限,报错信息如下图所示&a…

5.1二叉树——基本概念梳理

本篇博客梳理二叉树相关的基本概念 一、树的概念与结构 1.树是递归定义的 树根N棵子树,每棵子树也可按照相同方式拆分 注意:子树之间不能有交集,否则变成图(是另一种数据结构) 2.树的相关概…

Linux进程信号——信号的概念与产生

文章目录 信号及其产生与发送什么是Linux信号信号的产生终端按键系统调用软件条件硬件条件 核心转储存储临时信号 信号及其产生与发送 我们从生活中理解信号,例如各种指示灯,红绿灯之类的,我们能认识红绿灯是因为每一种不同的情况在我们大脑…

Apache Doris 跨集群数据同步 CCR 全面介绍

CCR 概述 CCR(Cross Cluster Replication)也就是跨集群数据复制,能够在库/表级别将源集群的数据变更同步到目标集群,可用于提升在线服务的数据可用性、隔离在离线负载、建设两地三中心等。 CCR 通常被用于容灾备份、读写分离、集…

末代皇帝Intel核显黑苹果,NUC10的性能到底有多强

末代皇帝Intel核显黑苹果,NUC10的性能到底有多强 一、可以核显的Intel iGPU有哪些 核显是一个伟大的产物,它可以在我们没有多余的钱去买多余的显卡的时候排上用场,特别是在mini小主机的市场上,核显就显得尤为重要的,…

图形化的Agent工具

1 图形化 Agent 工具 1.1 核心组件 机器人 Bot:一个 AI 应用,或称为 Agent知识库:上传个人数据,机器人可根据其内容进行回复工作流:将大问题拆解成多个小问题,通过路径实现,路径上的每个节点完…

tomcat实战演练

一.tomcat介绍 Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用, Tomcat 具有处理 HTML 页面的功能,它还是一个 Servlet 和 JSP容器。Tomc…

Python优化算法13——飞蛾扑火优化算法(MFO)

科研里面优化算法都用的多,尤其是各种动物园里面的智能仿生优化算法,但是目前都是MATLAB的代码多,python几乎没有什么包,这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考:Python优化算…

三种插入排序详解和代码实现(直接插入排序、折半插入排序和希尔排序)

目录 基本思想直接插入排序排序方法代码实现复杂度分析 折半插入排序排序方法代码实现复杂度分析 希尔排序排序方法代码实现复杂度分析最佳情况平均情况最坏情况增量序列的影响 基本思想 插入排序的基本思想是:每一趟将一个待排序的元素按照其关键字的大小插入到已经…

Hadoop 分布式集群搭建

HDFS分布式集群搭建 一、部署规划1.1 进程规划1.2 软件规划1.3 用户规划1.4 目录规划 二、 搭建HDFS 分布式集群2.1 HDFS 集群配置2.1.1 下载安装 Hadoop2.1.2 修改 hadoop-env.sh 配置文件2.1.3 修改 core-site.xml 配置文件2.1.4 修改 hdfs-site.xml 配置文件2.1.5 修改 slav…

力扣刷题(1)

两数之和 两数之和-力扣 思路: 动态开辟一个数组,用来存放下标;两个for循环嵌套来判断,数组中的两个数相加是否与target相等若相等,则将 * returnSize赋值为2,表示数组中两个数,并将arr数组…

数学建模之数据分析【九】:数据清理总结

文章目录 一、什么是数据清理二、为什么数据清理很重要三、执行数据清洁的步骤四、如何执行数据清理五、数据清理的Python库实现5.1 数据检查与探索5.2 使用df.info()检查数据信息5.3 检查分类和数字列5.4 检查分类列中唯一值的总数5.5 执行数据清理的步骤5.5.1 删除所有上述不…

真的爽到了!Coze的黑神话 “循环“ 闪亮登场,啥都能循环,让你一次通关!

心心念念了很久,Coze工作流终于支持循环操作啦,泪奔~~ 看,就在工作流节点的“选择器”和“意图识别”当中偷偷摸摸地多了一个“循环” 这玩意可比批处理强太多了,批处理只能在当前节点循环,做一些简单的循环任务还不错…

【日记】狗尾巴草与暗恋(1519 字)

写在前面 消极内容注意 正文 好想吃火龙果。 下周会变得异常艰难。因为事情已经垒到天上去了,还要来检查。 上午,同事送了一点水果,我从来没见过。问了一下别人,有的说是灯笼果,有的说是菇凉果、姑娘果。搜了一下&am…

深入理解Elasticsearch:让搜索性能飞起来!

Elasticsearch 概述 Elasticsearch是一个基于lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。 ELK 技术栈是Elasticsearch、Logstash、Kibana三大开元框架首字母大写简称。 而Elasticsearch 是一个开源的高扩展的分布式全文搜索引擎, 是整个 ELK技术…

polarctf靶场[WEB]Don‘t touch me、机器人、uploader、扫扫看

目录 [web]Dont touch me 考点:查看源代码、前端 [web]机器人 考点:robot协议 工具:御剑,kali dirsearch [web]覆盖 考点:parse_str覆盖 [web]扫扫看 考点:目录扫描 工具:御剑、kali d…

【冒泡排序算法】输入n个数进行排序

要求:输入n个数进行排序 实现:使用冒泡排序算法,使用C语言实现 冒泡排序的基本原理: 比较相邻元素:从数组的开始位置,比较每对相邻的元素。如果前一个元素大于后一个元素,则交换它们。重复过…

数组基本知识2

目录 前言 二维数组 使用原因 定义二维数组 访问数组元素 实例 前言 上一篇,我简单的复习了一维数组,本篇讲述二维数组的基本知识,帮助大家预习和复习。 二维数组 使用原因 本质原因:一维数组,已经无法满足解决…

OSPF路由配置--单区域

目录 因为OSPF有很多重要的特殊区域和内容,所以划分为多篇博客来配置 一. 实验拓扑图 二. 实验配置 三. 实验验证: 因为OSPF有很多重要的特殊区域和内容,所以划分为多篇博客来配置 不理解OSPF路由动态协议的可以回顾一下OSPF详解,下这一系列的实验都不再做解…