【Kotlin】委托模式

1 委托模式简介

        委托模式的类图结构如下。

        对应的 Kotlin 代码如下。

fun main() {var baseImpl = BaseImpl()var baseWrapper = BaseWrapper(baseImpl)baseWrapper.myFun1() // 打印: BaseImpl, myFun1baseWrapper.myFun2() // 打印: BaseImpl, myFun2
}interface Base {fun myFun1()fun myFun2()
}class BaseWrapper(var baseImpl: Base): Base {override fun myFun1() {baseImpl.myFun1()}override fun myFun2() {baseImpl.myFun2()}
}class BaseImpl: Base {override fun myFun1() {println("BaseImpl, myFun1")}override fun myFun2() {println("BaseImpl, myFun2")}
}

2 类委托

        Kotlin 可以简化 BaseWrapper,简化后的代码如下。

fun main() {var baseImpl = BaseImpl()var baseWrapper = BaseWrapper(baseImpl)baseWrapper.myFun1() // 打印: BaseImpl, myFun1baseWrapper.myFun2() // 打印: BaseImpl, myFun2
}interface Base {fun myFun1()fun myFun2()
}class BaseWrapper(var baseImpl: Base): Base by baseImplclass BaseImpl: Base {override fun myFun1() {println("BaseImpl, myFun1")}override fun myFun2() {println("BaseImpl, myFun2")}
}

3 属性委托

3.1 by T

import kotlin.reflect.KPropertyfun main() {var str: String by StringDelegate()str = "abc"println(str)
}class StringDelegate {var value: String? = nulloperator fun getValue(thisRef: Any?, property: KProperty<*>): String {println("getValue, thisRef=$thisRef, name=${property.name}, value=$value")return value ?: throw IllegalStateException("Property not initialized")}operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {println("setValue, thisRef=$thisRef, name=${property.name}, value=$value")this.value = value}
}

        打印日志如下。

setValue, thisRef=null, name=str, value=ABC
getValue, thisRef=null, name=str, value=ABC
ABC

3.2 by lazy

fun main() {// lazy为生成的委托对象, 获取属性时会执行lazy里面的操作, 只支持val变量val str: String by lazy { "666" }println(str) // 打印: 666
}

3.3 by Delegates.observable

fun main() {var str: String by Delegates.observable("666") { prop, old, new ->println("prop=$prop, old=$old, new=$new")}println(str) // 666// prop=property str (Kotlin reflection is not available), old=666, new=888str = "888"
}

3.4 by ::T

fun main() {var example = Example("ABC")example.str2 = "DEF"// str1=DEF, str2=DEFprintln("str1=${example.str1}, str2=${example.str2}")
}class Example(var str1: String) {var str2: String by ::str1
}

        说明:属性被委托后,str1 和 str2 同时修改。

3.5 by map

fun main() {var map: MutableMap<String, Any> = mutableMapOf("name" to "Tom","age" to 23,"id" to 1001)var user = User(map)println(user) // (Tom, 23, 1001)
}class User(map: MutableMap<String, Any>) {var name: String by mapvar age: Int by mapvar id: Int by mapoverride fun toString(): String = "($name, $age, $id)"
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【御控物联】JavaScript JSON结构转换(18):数组To对象——多层属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、案例之《JSON数组 To JSON对象》三、代码实现四、在线转换工具五、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0c;生成新的JS…

golang语言系列:Web框架+路由 之 Echo

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是golang语言系列文章&#xff0c;本篇主要对 Echo 框架 的基本使用方法 进行学习 1.Echo是什么 Go 有众多Web框架&#xff0c;Echo 是其中的一个&#xff0c;官网介绍Echo有高性能、可扩展性、极简的特点。使用E…

Object类的方法-clone() \ finalize()

了解方法&#xff1a;clone() \ finalize()根据JDK源代码及Object类的API文档&#xff0c;Object类当中包含的方法有11个。这里我们主要关注其中的6个&#xff1a; clone() //Object类的clone()的使用 public class CloneTest { public static void main(String[] args) { …

关于ITIL认证您需要了解的一切

这是一篇关于从业人员、领导者和 ITSM 爱好者指南。ITIL4于2019 年发布。最新版本的 IT 服务管理&#xff08;ITSM&#xff09;最佳实践从传统的生命周期方法转变为服务价值体系模型&#xff0c;重点关注价值共创、向业务交付成果以及与其他最佳实践框架的融合。 新版本的框架…

【教程】Kotlin语言学习笔记(五)——Lambda表达式与条件控制

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 第三章 《数据容器》 第四章 《方法》 第五章 《L…

Redission--布隆过滤器解决缓存穿透问题

布隆过滤器在缓存穿透问题中的使用 布隆过滤器的核心是一个位数组 布隆过滤器的误判 使用Redission的布隆过滤器步骤 添加 Redission 依赖&#xff1a;首先需要将 Redission 添加到你的 Java 项目中&#xff0c;你可以通过 Maven 来添加 Redission 的依赖。 创建 Redissio…

GT收发器PHY层设计(2)GT_module模块设计

文章目录 前言一、设计框图二、例化IP核端口三、common_reset_i模块四、gt_usrclk_source模块五、IBUFDS_GTE2和gtwizard_0_common模块六、顶层模块gt_module总结 前言 根据官方的example design设计一个自定义协议的高速PHY设计 一、设计框图 设计思路及代码思路参考FPGA奇哥…

九州未来深度参与元宇宙标准会议周

近日&#xff0c;元宇宙标准化工作组成立大会暨第一次全体委员会会议在浙江青田成功举办。本次会议由元宇宙标准化工作组主办&#xff0c;中国电子技术标准化研究院、中共青田县委 青田县人民政府承办&#xff0c;涵盖了《元宇宙参考架构》国家标准编制会、《工业元宇宙参考架构…

AI音乐GPT时刻来临:Suno 快速入门手册!

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

铸铁平台划线基准的基本操作——泊头市北重厂家

划线基准是指在铸铁平台上划定一条直线或直角线&#xff0c;用作测量和定位的参考线。下面是铸铁平台划线基准的操作步骤&#xff1a; 准备工具和材料&#xff1a;铸铁平台、直尺、铅笔或划线笔、胶带等。 清洁铸铁平台&#xff1a;使用清洁布或刷子清除铸铁平台表面的尘土和杂…

MySQL 中将使用逗号分隔的字段转换为多行数据

在我们的实际开发中&#xff0c;经常需要存储一些字段&#xff0c;它们使用像, - 等连接符进行连接。在查询过程中&#xff0c;有时需要将这些字段使用连接符分割&#xff0c;然后查询多条数据。今天&#xff0c;我们将使用一个实际的生产场景来详细解释这个解决方案。 场景介绍…

WebGIS 地铁交通线网数据可视化监控平台

数字孪生技术在地铁线网的管理和运维中的应用是一个前沿且迅速发展的领域。随着物联网、大数据、云计算以及人工智能技术的发展&#xff0c;地铁线网数字孪生在智能交通和智慧城市建设中的作用日益凸显。 图扑软件基于 HTML5 的 2D、3D 图形渲染引擎&#xff0c;结合 GIS 地图&…