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") } } 

Является ли это достойной реализацией шаблона MVP с использованием TornadoFX?

РЕДАКТИРОВАТЬ

Сделали некоторые изменения:

 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 }