ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 委托的定义 [TOC] 委托模式也叫代理模式,是最常用的设计模式的一种。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式已证明是实现继承的一个很好的替代方式。 委托在C#中是一个语言级特性。在Kotlin 也直接支持委托模式,更加优雅,简洁。**Kotlin 通过关键字 by 实现委托**。 **Kotlin中委托分为类委托和委托属性,Kotlin官方库也封装了一些常用的委托**。 ### 委托类 大家知道委托是由两个对象完成的,因此可以推测出类委托实际上也包含两个对象,一个是委托类,一个是被委托类。在委托类中并没有真正的功能方法,该类的功能是通过调用被委托类中的方法实现的。接下来我们通过一个案例来学习类委托的实现: 假如有如下场景,“大头儿子和小头爸爸都会洗碗,围裙妈妈让小头爸爸洗碗的时候,小头爸爸就让大头儿子洗碗,然后会在大头儿子洗碗之前,叮嘱大头儿子洗碗小心一点,在大头儿子洗碗之后,检查大头儿子洗碗洗干净没有”。 #### Java语言的代理模式实现 如果用Java语言的代码模式去实现,可以这样做,参考代码: ![](http://upload-images.jianshu.io/upload_images/7368752-40077e17b3738b2f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![](http://upload-images.jianshu.io/upload_images/7368752-430de42ba1ae0e32.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) #### Kotlin语言的委托模式实现 第一种方式 ``` interface Wash { fun washDishes() } class Child : Wash { override fun washDishes() { println("委托小头儿子洗碗,耶!") } } //第1种委托方式 class SmallFather : Wash by Child() {} fun main(args: Array<String>) { var smallFather = SmallFather() smallFather.washDishes() } ``` 运行结果 ``` 委托小头儿子洗碗,耶! ``` 上述代码中,定义了一个接口Wash,以及两个接口的实现类Child和SmallFather,而SmallFather类中并没有核心代码,SmallFather类要实现的功能委托给Child类进行处理。在main()函数中,通过创建委托对象SmallFather,调用被委托类Child中的方法washDishes(),即可实现委托功能,输出运行结果。 实际上类委托还有一种写法,就是在委托类继承接口的同时,传入一个被委托类的实例对象。 如果用Kotlin语言的代码模式去实现,可以这样做,参考代码: ![](http://upload-images.jianshu.io/upload_images/7368752-a02cc66c6e8819dd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![](http://upload-images.jianshu.io/upload_images/7368752-3303c0f2eecf0a63.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 对比以上代码以上代码,我们可以看出【Kotlin相比于Java,实现委托代理模式,更加简洁、优雅】