2016-08-11 3 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() } 
    } 

} 

демонстрационного Presenter:

class SampleTestPresenter: AbstractPresenter<SampleWindowView>() { 

fun doSomething() { 
    println("did it") 
} 

} 

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

EDIT

внесены некоторые изменения:

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' также являются синглтонами, поэтому вы можете просто поместить 'val view: SimpleTestView с помощью inject()' в ваш презентатор. Я не уверен, насколько важна функция onViewAttached. –

+0

@ RuckusT-Boom О, я вижу, я не знал, что взгляды - это одиночные игры. Абстрактные классы предназначены для обеспечения того, чтобы для каждого представления был прикреплен Ведущий. Я внес изменения в главный пост. Не стесняйтесь добавлять какие-либо предложения к нему. – 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: контроллер был бы лучше? Кроме того, если бы я хотел убедиться, что у ведущего есть представление, это можно сделать так же, как я представил в оригинальной записи правильно – Zocp

+0

Конечно, но мне кажется немного странным концептуально, чтобы у ведущего было представление, так как вы можете ' t используйте generics, чтобы заставить презентатора и представление быть сопряженным. –

+0

Но я не знаю вашего прецедента, поэтому, если он работает для вас, идите на это. –

Смежные вопросы