Sobes.tech
Middle

Rääkige mulle rohkem MVP (Model-View-Presenter) mustrist.

sobes.tech AI

Vastus AI-lt

MVP jagab rakenduse kolme vastastikku toimivat komponenti:

  • Mudelis: Halda rakenduse andmeid, äriloogikat. See ei sõltu kasutajaliidesest.
  • Vaade: Kuvab andmed kasutajale ja töötleb tema sisestusi. See on passiivne ega sisalda otsustusloogikat.
  • Esitleja: Toimib vahendajana Modeli ja Vaate vahel. Saab andmeid Modelist ja vormindab need Vaadale. Reageerib Vaate sündmustele ja uuendab Modeli. Vaade viitab Esitlejale, ning Esitleja viitab Vaatele liidese kaudu.

MVP eelised:

  • Stabiilsus UI muudatustes: Loogika asub Esitlejas, mis ei sõltu konkreetse Vaate rakendamisest.
  • Testitavus: Esitlejat on lihtne isoleeritult testida, ilma UI-mockimiseta.
  • Vastutuse jaotus: Komponentide selge jaotus parandab koodi hooldatavust.

Näide:

// Vaate liides
interface MainView {
    fun showData(data: String)
    fun showError(message: String)
}

// Esitleja
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("Andmete laadimine ebaõnnestus")
        }
    }
}

// Mudel
class MainModel {
    fun getData(): String? {
        // Andmete laadimine
        return "Näidandmed"
    }
}

// Tegevus (Vaate rakendamine)
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
    }
}