Middle
Opowiedz więcej o wzorcu MVP (Model-View-Presenter).
sobes.tech AI
Odpowiedź od AI
MVP dzieli aplikację na trzy współdziałające komponenty:
- Model: Zarządza danymi aplikacji i logiką biznesową. Nie zależy od interfejsu użytkownika.
- View: Wyświetla dane użytkownikowi i obsługuje jego wejście. Jest pasywna i nie zawiera logiki decyzyjnej.
- Presenter: Działa jako pośrednik między Modelem a Widokiem. Otrzymuje dane od Modelu i formatuje je dla Widoku. Reaguje na zdarzenia Widoku i aktualizuje Model. Widok odwołuje się do Presentera, a Presenter do Widoku przez interfejs.
Zalety MVP:
- Odporność na zmiany UI: Logika znajduje się w Presenterze, który nie zależy od konkretnej implementacji Widoku.
- Testowalność: Presenter jest łatwy do testowania w izolacji, bez konieczności mockowania UI.
- Podział odpowiedzialności: Jasny podział ról między komponentami poprawia utrzymanie kodu.
Przykład:
// Interfejs Widoku
interface MainView {
fun showData(data: String)
fun showError(message: String)
}
// Presenter
class MainPresenter(private val view: MainView, private val model: MainModel) {
fun loadData() {
val data = model.getData()
if (data != null) {
view.showData(data)
} else {
view.showError("Nie udało się załadować danych")
}
}
}
// Model
class MainModel {
fun getData(): String? {
// Ładowanie danych
return "Przykładowe dane"
}
}
// Aktywność (Implementacja Widoku)
class MainActivity : AppCompatActivity(), MainView {
private lateinit var presenter: MainPresenter
private lateinit var textView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textView = findViewById(R.id.textView)
val model = MainModel()
presenter = MainPresenter(this, model)
presenter.loadData()
}
override fun showData(data: String) {
textView.text = data
}
override fun showError(message: String) {
textView.text = message
}
}