簡體   English   中英

TornadoFX-創建MVP設計

[英]TornadoFX - Creating a MVP Design

您好,我不熟悉TornadoFX,我想知道使用TornadoFX的MVP結構的最佳設計是什么?

在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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM