委托

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

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

  1. interface CanFly {
  2. fun fly()
  3. }
  4. class Bird(f: CanFly) : CanFly by f

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

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

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

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

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

  1. class Bat : CanFly by AnimalWithWings()
  2. ...
  3. val bat = Bat()
  4. bat.fly()