8

Мое развитие широко использует проблему привязки ног робота. Я знаю how to solve it с PrivateModule в Guice, но неясно, как это будет сделано с шаблоном пирога Scala.Как использовать шаблон торта Scala для реализации ног робота?

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

ответ

3

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

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

// ======================= 
// 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 
Смежные вопросы