当前位置: 首页 > news >正文

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

前言

建造者模式(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.widgetimport android.app.Dialog
import android.content.Context
import android.graphics.Bitmap
import java.lang.IllegalArgumentExceptionclass StudentPickDialog(context: Context) : Dialog(context) {private var mId: Long = 0Lprivate var mAvatar: Bitmap? = nullprivate var mName: String = ""private var mAge: Int = 0private constructor(context: Context,id: Long,avatar: Bitmap?,name: String,age: Int) : this(context) {mAvatar = avatarmId = idmName = namemAge = age}companion object {fun init(context: Context): Builder {return Builder(context)}}data class Builder(private val mContext: Context) {private var mId: Long = 0Lprivate var mAvatar: Bitmap? = nullprivate 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 = ageif (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 中,建造者模式被广泛应用于需要配置多个选项、步骤复杂或构建过程不容易一步完成的场景。通过建造者模式,可以更轻松地创建和配置复杂对象。

相关文章:

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

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

Kafka 性能为什么比 RocketMQ 好

Kafka 性能更好的原因 因为 kafka 零拷贝技术跟 RocketMQ 的不一样。 kafka 零拷贝技术使用的是 sendfileDMA scatter/gather 。只需要经过 2 次拷贝,2 次上下文切换RocketMQ 零拷贝使用的 mmap 内存映射,需要经过 3 次拷贝,4 次上下文切换…...

el-image的配套使用(表格,表单)

1. 配合table在一起使用&#xff0c;支持预览 此处使用场景是表格中只显示一张图片 preview-src-list只支持数组&#xff0c;故需要将单个字符串转换为转换为字符串数组 <el-table-column align"center" label"二维码"><template slot-scope&q…...

MKS MWH-5匹配器Automatc matching impedance Network手侧

MKS MWH-5匹配器Automatc matching impedance Network手侧...

打卡50天------图论

正式开启图论了&#xff0c;作为一个前端工程师&#xff0c;这个代码随想录真的刷新了我对于算法的认知&#xff0c;每天都在学习新东西。 别着急、放轻松、慢慢来。 一、图论理论基础 二、深搜理论基础 了解一下深搜的原理和过程&#xff0c;其实对于深搜和广搜我自己也写过…...

实现 FastCGI

CGI的由来&#xff1a; 最早的 Web 服务器只能简单地响应浏览器发来的 HTTP 请求&#xff0c;并将存储在服务器上的 HTML 文件返回给浏 览器&#xff0c;也就是静态 html 文件&#xff0c;但是后期随着网站功能增多网站开发也越来越复杂&#xff0c;以至于出现动态技 术&…...

0x01 GlassFish 任意文件读取漏洞复现

参考文章&#xff1a; 应用服务器glassfish任意文件读取漏洞 - SecPulse.COM | 安全脉搏 fofa 搜索使用该服务器的网站 网络空间测绘&#xff0c;网络空间安全搜索引擎&#xff0c;网络空间搜索引擎&#xff0c;安全态势感知 - FOFA网络空间测绘系统 "glassfish"&…...

RLOC_ORIGIN

RLOC_ORIGIN属性为相对放置的对象提供绝对位置或LOC RTL设计中的宏&#xff08;RPM&#xff09;。有关定义RPM和使用 RLOC_ORIGIN属性&#xff0c;请参阅《Vivado Design Suite用户指南&#xff1a;使用约束》 &#xff08;UG903&#xff09;[参考文献19]。 RPM是通过使用H_set…...

【Python】成功解决 NameError: name ‘reload‘ is not defined

【Python】成功解决 NameError: name ‘reload’ is not defined 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校…...

Android.bp和Android.mk文件有的区别

文章目录 1. 构建系统2. 语法和格式3. 可维护性和扩展性4. 编译效率5. 未来趋势 在Android的构建系统中&#xff0c; Android.mk和 android.bp是用于定义如何编译项目文件的两种文件类型&#xff0c;它们有一些显著的区别。 1. 构建系统 Android.mk&#xff1a;使用于基于GN…...

思科设备静态路由实验

拓扑及需求 网络拓扑及 IP 编址如图所示&#xff1b;PC1 及 PC2 使用路由器模拟&#xff1b;在 R1、R2、R3 上配置静态路由&#xff0c;保证全网可达&#xff1b;在 R1、R3 上删掉上一步配置的静态路由&#xff0c;改用默认路由&#xff0c;仍然要求全网可达。 各设备具体配置…...

学习笔记第二十九天

IPC 进程间通信方式&#xff1a;共享内存 原理 共享内存是最高效的进程间通信方式之一&#xff0c;因为它允许两个或多个进程直接访问同一块物理内存区域。这种机制避免了数据在用户空间和内核空间之间的频繁拷贝&#xff0c;从而显著提高了数据传输的效率。 在Linux系统中&…...

Apache Paimon走在正确的道路上|一些使用体验和未来判断

Apache Paimon这个框架大家应该都不陌生了。 在实际工作中大家应该多多少少都用到&#xff0c;这个文章是一个简单的使用体会。不涉及湖框架的拉踩&#xff0c;我们的着眼点是解决实际问题。 我来结合自身体会跟大家说说Paimon这个框架和对未来的一些判断。大家可以参考&#x…...

安装MySQL入门基础指令

一.安装MySQL(以5.7版本为例) 1.一路默认安装&#xff0c;截图供大家参考 修改自己window安装名字即可 2.配置环境变量 C:\Program Files\MySQL\MySQL Server 5.7\bin 写入系统环境变量即可在window窗口使用其服务了 3.登录MySQL服务 进入控制台输入命令 mysql -u root …...

搜维尔科技:【研究】Haption Virtuose外科手术触觉视觉学习系统的开发和评估

Haption面临挑战 除此之外&#xff0c;外科医生有时会对骨组织进行非常复杂的手术&#xff0c;其中一个例子是人工耳蜗的手术植入。重要的是要避免神经或血管等危险结构受伤&#xff0c;并尽可能轻柔地进行手术。在外科医生能够安全、无差错地进行此类手术之前&#xff0c;需要…...

达梦表字段、字段类型,精度比对及更改字段SQL生成

达梦表字段、字段类型&#xff0c;精度比对及更改字段SQL生成&#xff1a; 依赖 <!-- 达梦 Connector --><dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.3.62</version>&l…...

2.pandas--读取文件夹中所有excel文件进行合并

文章目录 代码对应的本地文件文件夹目录三个文件夹中的内容test01.xlsxtest02.xlsxtest03.xlsx 三个文件合并后得到merge.xlsx文件文件内容 生成result.xlsx文件内容 代码 import glob import pandas as pddf_merge pd.DataFrame() # 创建一个空的DataFramefolder_path &qu…...

WPS Office两个严重漏洞曝光,已被武器化且在野利用

WPS Office作为一款用户基数超过2亿的广泛使用的办公套件&#xff0c;被发现存在两个关键漏洞&#xff08;CVE-2024-7262和CVE-2024-7263&#xff09;&#xff0c;这些漏洞可能导致用户遭受远程代码执行攻击。这两个漏洞的CVSS评分为9.3&#xff0c;表明它们的严重性很高&#…...

基于Java爬取微博数据(五) 补充微博正文列表图片 or 视频 内容

基于Java爬取微博数据五 补充微博正文列表图片 or 视频 内容 数据分析补充图片 or 视频执行结果 在通过对微博正文内容中的图片 or 视频内容进行分析后&#xff0c;图片 or 视频 链接是可以直接通过 Java 代码下载或者转存的&#xff0c;那么这样就可以补充我们在 【基于Java爬…...

反射异常捕获 | InvocationTargetException 要用e.getCause()打印才能看到具体异常

背景&#xff1a;线上某段和反射相关的代码报错了&#xff0c;但是异常信息打印只看到了 InvocationTargetException&#xff0c;没打印具体的异常。就像这样&#xff1a;java.lang.reflect.InvocationTargetException: null 查阅资料后发现要用e.getCause()才能打印具体异常&a…...

【计算机网络】网络版本计算器

此前我们关于TCP协议一直写的都是直接recv或者read&#xff0c;有了字节流的概念后&#xff0c;我们知道这样直接读可能会出错&#xff0c;所以我们如何进行分割完整报文&#xff1f;这就需要报头来解决了&#xff01; 但当前我们先不谈这个话题&#xff0c;先从头开始。 将会…...

使用 Python 爬虫进行网站流量分析:Referer 头的利用

在互联网时代&#xff0c;网站流量分析是了解用户行为、优化网站结构和提升用户体验的重要手段。本文将介绍如何使用 Python 爬虫技术结合 HTTP Referer 头进行网站流量分析&#xff0c;以及如何实现这一过程。 什么是 HTTP Referer 头&#xff1f; HTTP Referer 头是一个请求…...

梧桐数据库(WuTongDB):数据库技术中LL算法详解

LL 算法是一种自顶向下的语法分析算法&#xff0c;广泛用于构建解析器。LL 分析器逐个读取输入符号&#xff0c;从左到右分析&#xff08;Left-to-Right&#xff09;&#xff0c;并使用最左推导&#xff08;Leftmost Derivation&#xff09;来生成语法树。因此&#xff0c;LL 分…...

【秋招笔试】8.18大疆秋招(第一套)-后端岗

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…...

CSS 的text-size-adjust属性

text-size-adjust 属性在CSS中用于控制用户是否可以调整网页中文字的字体大小。这个属性主要针对移动设备上的浏览器&#xff0c;尤其是那些允许用户通过捏合&#xff08;pinch&#xff09;手势来缩放整个页面的浏览器。 语法 text-size-adjust: none; text-size-adjust: aut…...

阿里MAXCOMPUTE数据专辑信息读取并同步数据表

阿里MAXCOMPUTE数据专辑信息读取并同步数据表 在阿里云大数据体系中&#xff0c;我们可以使用数据地图的数据专辑&#xff0c;对数据的类别等进行一个管理 那么管理后的数据&#xff0c;我们想要落表进行相关的数据分析&#xff0c;如何做呢&#xff1f; 查看阿里云官方文档…...

rufus制作ubantu的U盘安装介质时,rufus界面上的分区类型选什么?

rufus制作ubantu的U盘安装介质时&#xff0c;rufus软件界面上的分区类型选什么(如下图&#xff09;&#xff1f; 在使用Rufus制作Ubuntu的U盘安装介质时&#xff0c;分区类型的选择取决于我们的计算机的引导方式。 以下是具体的选择建议&#xff1a; 1、查看计算机的引导方式…...

【系统架构设计师-2018年】案例分析-答案及详解

试题一&#xff08;25分&#xff09; 阅读以下关于软件系统设计的叙述&#xff0c;在答题纸上回答问题1至问题3。 【说明】 某文化产业集团委托软件公司开发一套文化用品商城系统&#xff0c;业务涉及文化用品销售、定制、竞拍和点评等板块&#xff0c;以提升商城的信息化建设…...

linux驱动入门实验班——平台总线设备驱动模型和设备树

目录 前言 一、重要结构体 二、编程思路 1.platform_driver结构体 2.probe 三、使用设备树 1.步进电机 2.红外遥控 四、代码示例 前言 在这里主要记录学习韦东山老师Linux驱动人入门实验班的笔记&#xff0c;韦东山老师的驱动课程讲的非常好&#xff0c;想要学习驱动…...

零基础学习Python(六)

1. 元类的应用 使用元类给对象添加一个固有属性author: 对类名进行限定&#xff0c;要求类名必须是大写字母开头&#xff1a; class MetaC(type):def __init__(cls, name, bases, attrs):if not name.istitle():raise TypeError("类名必须是大写字母开头~")return …...

网站建设预算计算方法/百度seo关键词优化市场

&#x1f447;&#x1f447;关注后回复 “进群” &#xff0c;拉你进程序员交流群&#x1f447;&#x1f447;一年一度高考季和毕业季&#xff0c;填报志愿和大学生就业成为焦点问题。曾经面对清华70%~80%的高考状元都选择了金融行业&#xff0c;施一公呐喊&#xff1a;中国大学…...

最专业网站建设公司/网络推广员是什么工作

BQMail&#xff1a;向IRIS发送地震数据申请的Python脚本实现徐弥坚;郝识杰;吴本君【期刊名称】《中国科技论文》【年(卷),期】2016(011)003【摘要】BQMaildevelopedonPython,isanopensourcesoftwarepackageforrequestingdatafromIncorporatedResearchInsti-tutionsforSeismolog…...

亳州网站开发/2022年网络流行语

本文作为小白入门级&#xff0c;相对基础&#xff0c;是写给现在想了解一点前端知识的设计师同行们。文章把前端相关的术语都用设计师熟悉的东西解释一遍&#xff08;比如<body>比喻成画布&#xff09;&#xff0c;通俗易懂幽默风趣&#xff0c;绝对是小白入门的好教程&a…...

视频收费网站怎么做/网址大全123

其实我以前倒是挺喜欢写一些文章的&#xff0c;而且我比较喜欢写散文之类的&#xff0c;感觉自己上学那会&#xff0c;那800字的作文&#xff0c;都是20分钟就可以搞定的。每次写作文前&#xff0c;只要有一个灵感&#xff0c;然后思路泉涌&#xff0c;然后就一气呵成。但是现在…...

政府工程招标网站/天津seo网站管理

我们经常用一些正则来验证url&#xff0c;但是php自带了一个类似的函数filter_var。函数用法&#xff1a;参数标志&#xff1a;FILTER_FLAG_SCHEME_REQUIRED – 要求 URL 是 RFC 兼容 URL。(比如&#xff1a;http://example)FILTER_FLAG_HOST_REQUIRED – 要求 URL 包含主机名(…...

https下安装wordpress/对网站进行seo优化

资源整理。这次太久没更新&#xff0c;最近比较忙。老规矩拆成两篇。 Coding: 1.比较独立&#xff0c;部分汇集和系统发育知识的生态位模型。“Niche estimation above and below the species level. Trends in Ecology and Evolution”论文的附件。 phyloENM TREE 2.用于生态预…...