Привет, я новичок в использовании 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 }