2016-08-11 49 views
0

你好我是新來使用TornadoFX,我想知道什麼MVP結構的最佳設計將使用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") 
    } 
} 
+0

爲什麼你需要抽象類? TornadoFX內置的'View'和'Controller'類對於MVC,MVP甚至MVVM(儘管被命名爲Controller)非常適用。 –

+0

另外,'View's也是單例,所以你可以在演示者中通過注入()''來放置'val view:SimpleTestView。我不確定onViewAttached函數有多重要。 –

+0

@ RuckusT-Boom哦,我看到我不知道這些意見是單身人士。抽象類在那裏強制實現這樣的想法,即對於每個View,都有一個Presenter附加到它。我對主文章進行了更改。隨意給它增加任何建議 – Zocp

回答

1

向上面總結討論,你可以簡單地做:

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 
} 
+0

感謝您總結討論。我肯定會使用抽象類,但我仍不確定泛型如何改進。我會使用Presenter:AbstractPresenter <*>或者使用Presenter:Controller會更好嗎?另外,如果我想確保主持人有看法,可以按照我在原始帖子右側 – Zocp

+0

中提供的相同方式完成。當然,但從概念上來說,確保主持人有看法似乎有點奇怪,因爲您可以'不要使用泛型來強制主持人和視圖進行配對。 –

+0

但是我不知道你的用例,所以如果它適合你,那就去做吧。 –