【Kotlin】委托模式

news/发布时间2024/5/21 16:25:04

1 委托模式简介

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

img

​ 对应的 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)"
}

​ 声明:本文转自【Kotlin】委托模式。

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

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

相关文章

DjangoRestFramework之DRF初识

一.Web应用两种开发模式 1、前后端不分离模式 也叫前后端混合开发模式, 需要后端写模板语言(DTL), 返回的是HTML页面,比如有BBS项目,图书管理系统。 在前后端不分离的项目中,模板渲染通常是在后端完成的。这种项目结构中,后端负责处理业务逻辑、与数据库交互,并最终生成 H…

Unity组件

二、Mesh网格 1 Mesh Filter Mesh Filter 组件包含对网格的引用。该组件与同一个游戏对象上的 Mesh Renderer 组件配合使用;Mesh Renderer 组件渲染 Mesh Filter 组件引用的网格。用于将网格数据应用到 3D 模型上。它是实现 3D 模型的重要组成部分之一,可以定义模型的形状和结…

最好用的Python IDE,pycharm保姆级安装教程

简介 由于Python语法简单容易入门,并且Python在办公自动化等领域的功能非常强大,所以现在越来越多非IT行业的人也开始学起了Python,要学习和使用一门编程语言,一个好用的IDE是必不可少的,而对于Python来说,最好的IDE无疑是Pycharm。本文就给大家介绍一下如何从零到一来安…

2-58. 实现农作物的重复收割

修改 Crop修改 GridMapManager修改 EventHandler修改 GridMapManager修改 Crop修改 CropDataList_SO项目相关代码 代码仓库:https://gitee.com/nbda1121440/farm-tutorial.git 标签:20240410_1825

uniapp转译微信小程序动态样式语法问题(:style)

这样书写之后编译成微信小程序时会出现一下情况造成此类原因是因为 我们直接给了一个对象而不是字符串(即直接给字符串不会出现此类问题) 而微信不能直接识别 所以直接在动态赋值时加上中括号

实验一-密码引擎-3-加密API研究

一、微软的Crypto API CryptoAPI 系统体系结构 Web Crypto API CSP开发基础--CryptoAPI函数简介 Crypto API结构 基本加密函数用于连接到 CSP 的_上下文函数_。 这些函数使应用程序能够按名称选择特定的 CSP,或选择可以提供所需功能类别的特定 CSP。 用于生成和存储加密密钥的…