【Kotlin回顾】24.委托

107 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第35天,点击查看活动详情

1.什么是委托

说到委托就要提及委托模式, 委托模式是设计模式中的一种,在委托模式中有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象处理。

举例:公司采购了一批新的电脑需要组装和安装系统才可以用,老板把这项工作交给了员工A和员工B,员工A负责组装电脑然后交给员工B,员工B负责安装系统,这样员工A和员工B一起完成老板分派的任务。

class EmployeesA {
    val employeesB = EmployeesB()

    fun work() {
        println("我来组装电脑")
        employeesB.work()
    }
}

class EmployeesB {
    fun work() {
        println("我来安装系统")
    }
}

fun main() {
    val employeesA = EmployeesA()
    employeesA.work()
}

//输出结果:
//我来组装电脑
//我来安装系统

2.类委托

上面的代码就是一个类委托的例子,只不过比较简单,现在我们再举一个比较复杂的例子

interface Worker {
    fun work()
}

class EmployeesA : Worker {

    override fun work() {
        println("我来组装电脑")
    }
}

class EmployeesB : Worker {
    override fun work() {
        println("我来安装系统")
    }
}

class EmployeesManager(worker: Worker) : Worker by worker

fun main() {
    EmployeesManager(EmployeesA()).work()
    EmployeesManager(EmployeesB()).work()
}

//输出结果:
//我来组装电脑
//我来安装系统

现在有一个Worker接口,里面有一个work方法,EmployeesAEmployeesB都实现这个接口,然后员工管理类EmployeesManager它也实现了Worker接口但是它不作具体的事情而是通过by关键字将其委托给worker,具体谁做什么由传递的参数决定。

上面代码中的EmployeesManager在Java中的实现方式是这样的

public final class EmployeesManager implements Worker {
    private final Worker $$delegate_0;

    public EmployeesManager(@NotNull Worker worker) {
        super();
        this.$$delegate_0 = worker;
    }

    public void work() {
        this.$$delegate_0.work();
    }
}

work()方法将执行流程委托给了传入的worker对象。Kotlin的委托类通过by关键字提供了语法层面的委托模式。或者说通过by关键字就可以省略一些接口方法适配的模板代码。

3.委托属性

1.标准委托

class Item {
    var count = 0
    var total: Int by ::count
}

上面代码中totalcount的值是一样的,count的定义时var这说明它可变,那么也就是说当调用total时其实调用的是countget,当count的值改变时total的值也会改变。

这里by关键字就是委托,::count是属性引用

2.懒加载委托

懒加载用它主要解决的就是需要频繁访问且资源消耗过大的问题,只有在访问时才会触发它,这样就避免了不必要的资源开销。