美文网首页Kotlin
【Kotlin】委托模式

【Kotlin】委托模式

作者: LittleFatSheep | 来源:发表于2024-04-05 10:48 被阅读0次

1 委托模式简介

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

对应的 Kotlin 代码如下。

fun main() {
    var baseImpl = BaseImpl()
    var baseWrapper = BaseWrapper(baseImpl)
    baseWrapper.myFun1() // 打印: BaseImpl, myFun1
    baseWrapper.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, myFun1
    baseWrapper.myFun2() // 打印: BaseImpl, myFun2
}

interface Base {
    fun myFun1()
    fun myFun2()
}

class BaseWrapper(var baseImpl: Base): Base by baseImpl

class BaseImpl: Base {
    override fun myFun1() {
        println("BaseImpl, myFun1")
    }

    override fun myFun2() {
        println("BaseImpl, myFun2")
    }
}

3 属性委托

3.1 by T

import kotlin.reflect.KProperty

fun main() {
    var str: String by StringDelegate()
    str = "abc"
    println(str)
}

class StringDelegate {
    var value: String? = null

    operator 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=888
    str = "888"
}

3.4 by ::T

fun main() {
    var example = Example("ABC")
    example.str2 = "DEF"
    // str1=DEF, str2=DEF
    println("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 map
    var age: Int by map
    var id: Int by map

    override fun toString(): String = "($name, $age, $id)"
}

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

相关文章

  • Kotlin中的委托

    Kotlin中的委托 啥是委托 其实kotlin中的委托的理念就是委托模式也是叫做代理模式;在Kotlin中委托有...

  • Kotlin委托

    Kotlin委托 1.Kotlin中的委托有两种形式,一种是委托模式,一种是委托属性。 2.委托模式是设计模式中的...

  • Kotlin for android学习八:委托

    前言 kotlin官网和kotlin教程学习教程的笔记。 一、类的委托 背景:委托模式是类继承模式之外的另一种很好...

  • Kotlin中的类委托和属性委托

    Kotlin的委托可分为类委托和属性委托。 一、类委托 类委托是代理模式的应用,而代理模式可以作为继承的一个不错的...

  • Kotlin 委托模式用于 Android 开发

    委托模式被证明是一种很好的替代继承的方式,Kotlin 在语言层面对委托模式提供了非常优雅的支持(语法糖)。 先给...

  • Kotlin by

    kotlin 中的委托模式依靠by关键字,语法定义 val/var :by ...

  • Kotlin学习(二):常用关键字

    by 委托模式 Kotlin中,委托的实现依靠于关键字 by ,by表示将抽象主题的实例(by后边的实例)保存在代...

  • Kotlin的operator与by实现委托模式

    kotlin的类的委托是通过operator与by关键进行处理,委托作为一种传统的设计模式,在Java中要想实现这...

  • [学习]拥抱kotlin(六)

    今天看委托模式。有一篇讲得不错的: 一文彻底搞懂Kotlin中的委托[https://juejin.cn/post...

  • Kotlin by 关键字

    1.Kotlin委托 在委托模式中,两个对象参与处理同一请求,接受请求的对象讲请求委托给另外一个对象来处理。Kot...

网友评论

    本文标题:【Kotlin】委托模式

    本文链接:https://www.haomeiwen.com/subject/qafntjtx.html