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

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

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

1 Ответ

3 голосов
/ 28 января 2012

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

Я думаю, что приведенный выше ответ более читабелен, но если вы уже знакомы с примером Джонаса, вот как вы можете настроить 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
...