# 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