zoukankan      html  css  js  c++  java
  • Kotlin开发 委托

    前言

       kotlin的委托模式其实就是Java的代理模式,是软件设计模式中的一项基本技巧。不管是代理还是委托都是可以从字面意思中理解,将一个"A对象"需要完成的工作交由另一位"B对象"完成.

    这里对代理模式理解不深刻的人,就会有疑问了,为什么在代码里不直接让A对象完成工作呢? 为什么要绕圈圈给B对象完成呢?

    原因如下:

    1.委托或者代理设计后,A对象可以保持代码上的简洁性,只需要关注提供什么与获取什么. 具体复杂的处理与数据组装工作流程可以隐藏在B对象里.

    2.以一个不变的A对象,去请求多种代理. 就好比同样使用鸡蛋与面粉, B工厂可以生产蛋挞, 而C工厂可以生产面包. 而我们A店面统一将获取的产品称为面点类食品,并且保持A店面的干净简洁.


    Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。

    在此篇模块里介绍了java的静态与动态代理: https://www.cnblogs.com/guanxinjing/p/14070749.html

     参考 https://www.runoob.com/kotlin/kotlin-delegated.html

    类委托

    类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。

    //接口
    interface IInfoService {
        fun setInfo()
    }
    
    //实现此接口的被委托的类
    class InfoDao : IInfoService {
        override fun setInfo() {
            print("设置数据中")
        }
    }
    
    //通过关键字 by 建立委托类
    class InfoDaoProxy(dao: InfoDao) : IInfoService by dao
    
    fun main() {
        val dao = InfoDao()
        InfoDaoProxy(dao).setInfo()
    }

    属性委托

    属性委托,顾名思义就是将一个类中的属性不是直接定义, 而是让一个代理类帮忙处理. 这样这个属性的获取值的会在代码上变的特别简洁一目了然,从而不需要在类某个方法或者运行代码中给这个属性设置值.

    class User {
        val name: String by UserData()
    }
    
    class UserData {
        var name: String = "小明"
        operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
            println("申请代理者 = $thisRef 属性名称 = ${property.name}" )
            return name
        }
    
        operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
            println("申请代理者 = $thisRef 属性名称 = ${property.name}" )
            this.name = value
        }
    }
    
    fun main() {
        val name = User().name
        println("用户名称1 $name")
    
        val userdata = UserData()
        val name2:String by userdata
        userdata.name = "小红"
        println("用户名称2 $name2")
    }

    结果:

    申请代理者 = com.example.myapplication.proxy.User@3abbfa04 属性名称 = name
    用户名称1 小明
    申请代理者 = null 属性名称 = name2
    用户名称2 小红

    延迟属性Lazy

  • 相关阅读:
    hdu1686 最大匹配次数 KMP
    洛谷 P5057 [CQOI2006]简单题(树状数组)
    洛谷 P5020 货币系统
    洛谷 P5019 铺设道路(差分)
    洛谷 P1119 灾后重建(Floyd)
    洛谷 P1082 同余方程(同余&&exgcd)
    洛谷 P2384 最短路
    洛谷 P3371 【模板】单源最短路径(弱化版) && dijkstra模板
    洛谷 P1387 最大正方形
    洛谷 P2866 [USACO06NOV]糟糕的一天Bad Hair Day
  • 原文地址:https://www.cnblogs.com/guanxinjing/p/15612060.html
Copyright © 2011-2022 走看看