Kotlin開發 委託

前言

   kotlin的委託模式其實就是Java的代理模式,是軟件設計模式中的一項基本技巧。不管是代理還是委託都是可以從字面意思中理解,將一個"A對象"需要完成的工作交由另一位"B對象"完成.

這裏對代理模式理解不深刻的人,就會有疑問了,爲什麼在代碼裏不直接讓A對象完成工作呢? 爲什麼要繞圈圈給B對象完成呢?

原因如下:

1.委託或者代理設計後,A對象可以保持代碼上的簡潔性,只需要關注提供什麼與獲取什麼. 具體複雜的處理與數據組裝工作流程可以隱藏在B對象裏.

2.以一個不變的A對象,去請求多種代理. 就好比同樣使用雞蛋與麪粉, B工廠可以生產蛋撻, 而C工廠可以生產麪包. 而我們A店面統一將獲取的產品稱爲麪點類食品,並且保持A店面的乾淨簡潔.


Kotlin 直接支持委託模式,更加優雅,簡潔。Kotlin 通過關鍵字 by 實現委託。

在此篇模塊裏介紹了java的靜態與動態代理: https://www.cnblogs.com/guanxinjing/p/14070749.html

 參考 https://www.runoob.com/kotlin/kotlin-delegated.html

類委託

類的委託即一個類中定義的方法實際是調用另一個類的對象的方法來實現的。

//接口
interface IInfoService {
    fun setInfo()
}

//實現此接口的被委託的類
class InfoDao : IInfoService {
    override fun setInfo() {
        print("設置數據中")
    }
}

//通過關鍵字 by 建立委託類
class InfoDaoProxy(dao: InfoDao) : IInfoService by dao

fun main() {
    val dao = InfoDao()
    InfoDaoProxy(dao).setInfo()
}

屬性委託

屬性委託,顧名思義就是將一個類中的屬性不是直接定義, 而是讓一個代理類幫忙處理. 這樣這個屬性的獲取值的會在代碼上變的特別簡潔一目瞭然,從而不需要在類某個方法或者運行代碼中給這個屬性設置值.

class User {
    val name: String by UserData()
}

class UserData {
    var name: String = "小明"
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        println("申請代理者 = $thisRef 屬性名稱 = ${property.name}" )
        return name
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("申請代理者 = $thisRef 屬性名稱 = ${property.name}" )
        this.name = value
    }
}

fun main() {
    val name = User().name
    println("用戶名稱1 $name")

    val userdata = UserData()
    val name2:String by userdata
    userdata.name = "小紅"
    println("用戶名稱2 $name2")
}

結果:

申請代理者 = com.example.myapplication.proxy.User@3abbfa04 屬性名稱 = name
用戶名稱1 小明
申請代理者 = null 屬性名稱 = name2
用戶名稱2 小紅

 

 

延遲屬性Lazy

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章