TornadoFX – 创建一个MVP设计

你好我是使用TornadoFX的新手,我想知道MVP结构的最佳设计是使用TornadoFX吗?

在MVP看来:

– >会将所有事件委托给演示者中的某个功能,例如按钮点击

– >不与模型交互

以下是一些粗糙的原型想法:

abstract class AbstractPresenter<View : tornadofx.View> : Controller() { var view: View by Delegates.notNull() fun attachView(view: View) { this.view = view; } } 

我创建一个自己附加到AbstractView的演示者:

 abstract class AbstractView<out Presenter : AbstractPresenter<*>> : View() { abstract val presenter: Presenter } 

现在在一个例子中使用它:

 class SampleTestView: AbstractView<SampleTestPresenter>() { override val presenter: SampleTestPresenter by inject() override val root: AnchorPane by fxml() val testButton: Button by fxid() init { presenter.attachView(this) testButton.setOnAction { presenter.doSomething() } } } 

示例演示者:

 class SampleTestPresenter: AbstractPresenter<SampleWindowView>() { fun doSomething() { println("did it") } } 

这是使用TornadoFX MVP模式的体面实现?

编辑

做了一些改变:

 class SampleWindowView : View() { override val root: AnchorPane by fxml() val presenter : SampleWindowViewPresenter by inject() val button:Button by fxid() init { button.setOnAction { presenter.handleButtonClick() } } } class SampleWindowViewPresenter : Controller() { val sampleView: SampleWindowView by inject() fun handleButtonClick() { println("clicked") } } 

总结上面的讨论,你可以简单地做:

 class SampleTestView : View() { val presenter: SampleTestPresenter by inject() override val root: AnchorPane by fxml() val testButton: Button by fxid() init { testButton.setOnAction { presenter.doSomething() } } } class SampleTestPresenter : Controller() { val view: SampleTestView by inject() fun doSomething() { println("Did the thing") } } 

如果你想确保视图有一个主持人,你可以创建一个抽象的视图,并让它的所有视图延伸:

 abstract class AbstractView<Presenter : Controller> : View() { abstract val presenter: Presenter }