????????????委托模式是軟件設(shè)計(jì)模式中的一項(xiàng)基本技巧断国。在委托模式中嗤锉,有兩個(gè)對象參與處理同一個(gè)請求源祈,接受請求的對象將請求委托給另一個(gè)對象來處理煎源。
Kotlin 支持委托模式, 通過關(guān)鍵字 by 實(shí)現(xiàn)委托香缺。
類委托
? ?類的委托即一個(gè)類中定義的方法實(shí)際是調(diào)用另一個(gè)類的對象的方法來實(shí)現(xiàn)的手销。
以下實(shí)例中派生類 Derived 繼承了接口 IBase 所有方法,并且委托一個(gè)傳入的 Base 類的對象來執(zhí)行這些方法图张。
屬性委托
? ? ? 屬性委托指的是一個(gè)類的某個(gè)屬性值不是在類中直接進(jìn)行定義锋拖,而是將其托付給一個(gè)代理類,從而實(shí)現(xiàn)對該類的屬性統(tǒng)一管理祸轮。
屬性委托語法格式:
val/var <屬性名>: <類型> by <表達(dá)式>
var/val:屬性類型(可變/只讀)
屬性名:屬性名稱
類型:屬性的數(shù)據(jù)類型
表達(dá)式:委托代理類
by 關(guān)鍵字之后的表達(dá)式就是委托, 屬性的 get() 方法以及set() 方法將被委托給這個(gè)對象的 getValue() 和 setValue() 方法兽埃。屬性委托不必實(shí)現(xiàn)任何接口, 但必須提供 getValue() 函數(shù),對于 var屬性,還需要 setValue() 函數(shù)。
定義一個(gè)被委托的類
該類需要包含 getValue() 方法和 setValue() 方法适袜,且參數(shù) thisRef 為進(jìn)行委托的類的對象柄错,prop 為進(jìn)行委托的屬性的對象。
輸出結(jié)果為:
標(biāo)準(zhǔn)委托
Kotlin 的標(biāo)準(zhǔn)庫中已經(jīng)內(nèi)置了很多工廠方法來實(shí)現(xiàn)屬性的委托。
延遲屬性 Lazy
lazy() 是一個(gè)函數(shù), 接受一個(gè) Lambda 表達(dá)式作為參數(shù), 返回一個(gè) Lazy <T> 實(shí)例的函數(shù)售貌,返回的實(shí)例可以作為實(shí)現(xiàn)延遲屬性的委托: 第一次調(diào)用 get() 會執(zhí)行已傳遞給 lazy() 的 lamda 表達(dá)式并記錄結(jié)果给猾, 后續(xù)調(diào)用 get() 只是返回記錄的結(jié)果。入下面的單例模塊:
可觀察屬性 Observable
observable 可以用于實(shí)現(xiàn)觀察者模式颂跨。
Delegates.observable() 函數(shù)接受兩個(gè)參數(shù): 第一個(gè)是初始化值, 第二個(gè)是屬性值變化事件的響應(yīng)器(handler)敢伸。
在屬性賦值后會執(zhí)行事件的響應(yīng)器(handler),它有三個(gè)參數(shù):被賦值的屬性恒削、舊值和新值:
輸出結(jié)果入下: