委托

委托模式是一个很有用的模式,它可以用来从类中抽取出主要负责的部分。委托模式是Kotlin原生支持的,所以它避免了我们需要去调用委托对象。委托者只需要指定实现的接口的实例。

在我们前面的例子中,我们可以通过构造函数指定动物怎么飞行,而不是实现它。比如,一个使用翅膀飞行的动物可以用这种方式指定:

interface CanFly {
    fun fly()
}

class Bird(f: CanFly) : CanFly by f

我们可以使用接口来指示鸟可以飞行,但是鸟的飞行方式被定义在一个委托中,这个委托定义在构造函数中,所以我们可以针对不同的鸟使用不同的飞行方式。动物使用翅膀飞行的方式被定义在另一个类中:

class AnimalWithWings : CanFly {
    val wings: Wings = Wings()
    override fun fly() = wings.move()
}

动物扇动翅膀来飞行。所以我们可以创建一个鸟,它使用翅膀飞行:

val birdWithWings = Bird(AnimalWithWings())
birdWithWings.fly()

但是现在翅膀可以被别的不是鸟类的动物使用。如果我们假设蝙蝠使用翅膀,我们可以直接指定委托来实例化对象:

class Bat : CanFly by AnimalWithWings()
...
val bat = Bat()
bat.fly()