🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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`关键字修饰。