是否可以在Scala应用程序中隐藏视图实现?

时间:2020-10-05 10:11:23

标签: scala swing javafx model-view-controller scalafx

我的目标是在模拟应用程序中使用MVC模式,其中控制器知道存在视图(并使用接口与之交互),但不知道其实现方式:

object Controller extends App {
  View.initView()
  ...
}

object View {
  stage: Stage = ...
  
  def initView: Unit = {
    ...
  }
}

但是,我只是设法让程序的入口点扩展了scalafx.application.JFXApp,javafx.application.Application(下面的示例)或swing.SimpleSwingApplication,它们迫使控制器知道如何实现视图。有没有简单的解决方法?

def main(args: Array[String]): Unit = {
  Application.launch(classOf[SimulatorApp])
}

class SimulatorApp extends Application {
  override def start(stage: Stage): Unit = {
    View.initView(stage)
  }
}

1 个答案:

答案 0 :(得分:2)

好吧,您可以将应用程序设计为抽象的,例如。

class MyApplication(dependency1: Dependency1, dependency2: Dependency2)
  extends Application {

  // code using things
}

然后将实现传递到其他地方

class MyApplicationImplemented 
  extends MyApplication(implementation1, implentation2)

Application.launch(classOf[MyApplicationImplemented])

依赖项可能是:

  • 实例
  • 实例(功能)的配方
  • 配置

您还可以使某些方法抽象化并在顶层实现它们。

通常,您使用Application方法将最终的main实现视为类-这不是您将依赖项传递到的对象,而是最终将它们连接在一起的地方。因此,最后必须将其设计为main。 ({launch方法的签名确认这是目的)。

这表示可以将许多逻辑提取到traitabstract class es或组件中,以便您可以在其他地方使用一些通用逻辑,使其依赖于依赖注入,创建多个实现,并将它们连接到单独的“电源”中,例如生产代码和端到端测试。

相关问题