开启掘金成长之旅!这是我参与「掘金日新计划 · 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方法,EmployeesA和EmployeesB都实现这个接口,然后员工管理类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
}
上面代码中total和count的值是一样的,count的定义时var这说明它可变,那么也就是说当调用total时其实调用的是count的get,当count的值改变时total的值也会改变。
这里by关键字就是委托,::count是属性引用
2.懒加载委托
懒加载用它主要解决的就是需要频繁访问且资源消耗过大的问题,只有在访问时才会触发它,这样就避免了不必要的资源开销。