Sobes.tech
Middle

Pastāstiet sīkāk par MVP (Model-View-Presenter) modeli.

sobes.tech AI

Atbilde no AI

MVP sadala lietojumprogrammu trīs savstarpēji mijiedarbojošās sastāvdaļās:

  • Modelis: Pārvalda lietojumprogrammas datus, biznesa loģiku. Tas nav atkarīgs no lietotāja saskarnes.
  • Skats: Attēlo datus lietotājam un apstrādā viņa ievadi. Tas ir pasīvs un nesatur lēmumu pieņemšanas loģiku.
  • Prezentētājs: Darbojas kā starpnieks starp Modeli un Skatu. Tas saņem datus no Modeļa un formatē tos Skatam. Reaģē uz Skata notikumiem un atjauno Modeli. Skats atsaucas uz Prezentētāju, bet Prezentētājs atsaucas uz Skatu caur saskarni.

MVP priekšrocības:

  • UI izmaiņu izturība: Loģika atrodas Prezentētājā, kas nav atkarīga no konkrētas Skata realizācijas.
  • Testējamība: Prezentētāju ir viegli testēt izolēti, bez UI moku.
  • Atbildības sadalījums: Komponentu skaidra sadale uzlabo koda uzturēšanu.

Piemērs:

// Skata saskarne
interface MainView {
    fun showData(data: String)
    fun showError(message: String)
}

// Prezentētājs
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("Neizdevās ielādēt datus")
        }
    }
}

// Modelis
class MainModel {
    fun getData(): String? {
        // Datu ielāde
        return "Piemēra dati"
    }
}

// Aktivitāte (Skata īstenošana)
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
    }
}