Как я могу использовать шаблон торта Scala для реализации ног робота?

Моя разработка широко использует проблему связывания ног робота. Я знаю, как решить это с PrivateModule в Guice, но не ясно, как это будет сделано с шаблоном торта Scala.

Может ли кто-нибудь объяснить, как это будет сделано, в идеале на конкретном примере, основанном на примере кофе Джонаса Бонера в конце его сообщения в блоге? Может быть, с подогревателем, который может быть настроен для левой и правой сторон, вводится с ориентацией и def isRightSide?

1 ответ

Шаблон торт не решает эту проблему в своем первоначальном виде. У вас есть несколько вариантов, как справиться с этим. Решение, которое я предпочитаю, состоит в том, чтобы создать каждую "ногу робота", вызывая ее конструктор с соответствующим параметром - код показывает это лучше, чем слова.

Я думаю, что приведенный выше ответ более читабелен, но если вы уже знакомы с примером Jonas, вот как вы можете сделать Warmer настраиваемым с ориентацией:

// =======================
// service interfaces
trait OnOffDeviceComponent {
  val onOff: OnOffDevice
  trait OnOffDevice {
    def on: Unit
    def off: Unit
  }
}
trait SensorDeviceComponent {
  val sensor: SensorDevice
  trait SensorDevice {
    def isCoffeePresent: Boolean
  }
}

// =======================
// service implementations
trait OnOffDeviceComponentImpl extends OnOffDeviceComponent {
  class Heater extends OnOffDevice {
    def on = println("heater.on")
    def off = println("heater.off")
  }
}
trait SensorDeviceComponentImpl extends SensorDeviceComponent {
  class PotSensor extends SensorDevice {
    def isCoffeePresent = true
  }
}
// =======================
// service declaring two dependencies that it wants injected
trait WarmerComponentImpl {
  this: SensorDeviceComponent with OnOffDeviceComponent =>

  // Note: Warmer's orientation is injected by constructor.
  // In the original Cake some mixed-in val/def would be used
  class Warmer(rightSide: Boolean) {
    def isRightSide = rightSide
    def trigger = {
      if (sensor.isCoffeePresent) onOff.on
      else onOff.off
    }
  }
}

// =======================
// instantiate the services in a module
object ComponentRegistry extends
  OnOffDeviceComponentImpl with
  SensorDeviceComponentImpl with
  WarmerComponentImpl {

  val onOff = new Heater
  val sensor = new PotSensor
  // Note: now we need to parametrize each particular Warmer
  // with its desired orientation
  val leftWarmer = new Warmer(rightSide = false)
  val rightWarmer = new Warmer(rightSide = true)
}

// =======================
val leftWarmer = ComponentRegistry.leftWarmer
leftWarmer.trigger
Другие вопросы по тегам