Sobes.tech
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
    }
}