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 }