# 1. 委托模式
委托模式也叫代理模式,是最常用的一種設計模式。在`Kotlin`中,委托是通過`by`關鍵字實現的,并且主要分為兩種形式,一種是類委托,一種是屬性委托
## 1.1 類委托
> 包含兩個對象,一個是委托類,一個是被委托類。在委托類中并沒有真正的功能方法,該類的功能是通過調用被委托類中的方法實現的。
從上面我們可以知道其實就是抽象接口和實現的關系。比如下面的案例:
~~~
interface Dinner{
fun getInfo(name: String);
}
class Person: Dinner{
override fun getInfo(name: String) {
println("吃晚飯--${name}")
}
}
// 委托
class Bob: Dinner by Person() {}
fun main() {
Bob().getInfo("魚香茄子")
}
~~~
結果:
```
吃晚飯--魚香茄子
```
上面這種寫法需要事先知道,并且固定了由誰來委托處理。有時候可能需要動態,比如下面的寫法:
~~~
interface Dinner{
fun getInfo(name: String);
}
class Person: Dinner{
override fun getInfo(name: String) {
println("人吃晚飯--${name}")
}
}
class Animal: Dinner{
override fun getInfo(name: String) {
println("動物吃晚飯--${name}")
}
}
// 委托
class Bob(dinner: Dinner): Dinner by dinner
fun main() {
Bob(Person()).getInfo("魚香茄子")
Bob(Animal()).getInfo("魚香茄子")
}
~~~
結果:
```
人吃晚飯--魚香茄子
動物吃晚飯--魚香茄子
```
也就是委托可以交給類,也可以交給類對象實例。
## 1.2 屬性委托
屬性委托是指一個類的某個屬性值**不是在類中直接進行定義,而是將其委托給一個代理類**,從而實現對該類的屬性進行統一管理。
對于`val`類型的屬性,只需提供一個`getValue()`方法即可,但是對于`var`類型的屬性,則需要提供`getValue()`和`setValue()`方法。
~~~
class Person{
var name = "辣子雞"
operator fun setValue(bob: Bob, property: KProperty<*>, s: String) {
this.name = s
}
operator fun getValue(bob: Bob, property: KProperty<*>): String {
return this.name
}
}
// 屬性委托
class Bob(){
var name: String by Person()
}
fun main() {
var bob = Bob()
bob.name = "拉面"
println("Bob喜歡吃${bob.name}")
}
~~~
結果:
```
Bob喜歡吃拉面
```
注意:
`setValue()`方法和`getValue()`方法前必須使用`operator`關鍵字修飾。
- Kotlin語言基礎
- Kotlin的簡介
- Kotlin的變量和常見數據類型
- Kotlin的區間
- Kotlin的位運算
- Kotlin的容器
- Kotlin類型檢查
- Kotlin的空值處理
- Kotlin的函數
- Kotlin的類
- Kotlin的委托
- Kotlin的延遲加載
- Kotlin的異常
- Kotlin的Lambda表達式
- Kotlin的高階函數
- Kotlin的標準庫中的高階函數
- Kotlin的泛型
- Kotlin的表達式
- Kotlin的解構
- Kotlin的運算符重載
- Kotlin語言中級
- Kotlin的擴展函數
- Kotlin的擴展屬性
- Kotlin的infix關鍵字
- Kotlin的DSL
- Kotlin的一些注解(和Java互調用)
- Kotlin的lateinit和by lazy
- Kotlin的反射
- Kotlin的匿名接口
- 安卓中的Kotlin
- 數據庫操作Room