2016-08-11 2 views
0

안녕하세요 저는 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; 
} 
} 

:

,
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 by SimpleTestView'를 당신의 발표자에 넣을 수 있습니다. 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

토론을 요약 해 주셔서 감사합니다. 확실히 추상 클래스를 사용할 것이지만 generics가 어떻게 향상 될 수 있는지는 아직 확신 할 수 없습니다. Presenter : AbstractPresenter <*>을 사용하거나 Presenter : Controller를 사용 하시겠습니까? 또한 발표자가 볼 수 있도록하려면 원래 게시물 오른쪽에 표시된 것과 같은 방식으로 수행 할 수 있습니다. – Zocp

+0

물론, 개념적으로 볼 때 발표자가 볼 수 있도록하기에는 조금 이상합니다. 제네릭을 사용하여 발표자와 뷰를 쌍으로 만듭니다. –

+0

하지만 당신의 유스 케이스에 대해 잘 모르겠습니다. 그래서 당신을 위해 작동한다면, 그것으로 가십시오. –