Sobes.tech
Middle

Papasakokite išsamiau apie MVP (Model-View-Presenter) modelį.

sobes.tech AI

Atsakymas iš AI

MVP padalina taikymą į tris sąveikaujančius komponentus:

  • Modelis: Valdo programos duomenis, verslo logiką. Jis nepriklauso nuo naudotojo sąsajos.
  • Vaizdas: Rodo duomenis naudotojui ir apdoroja jo įvestį. Jis yra pasyvus ir neturi sprendimų priėmimo logikos.
  • Pristatymas: Veikia kaip tarpininkas tarp Modelio ir Vaizdo. Jis gauna duomenis iš Modelio ir formatuoja juos Vaizdui. Reaguoja į Vaizdo įvykius ir atnaujina Modelį. Vaizdas nurodo Pristatymą, o Pristatymas nurodo Vaizdą per sąsają.

MVP privalumai:

  • Stabilumas UI pokyčiuose: Logika yra Pristatymo dalyje, kuris nepriklauso nuo konkretaus Vaizdo.
  • Testavimas: Pristatymą lengva testuoti izoliuotai, be UI mockavimo.
  • Atsakomybės pasidalijimas: Aiškus komponentų pasidalijimas gerina kodo priežiūrą.

Pavyzdys:

// Vaizdo sąsaja
interface MainView {
    fun showData(data: String)
    fun showError(message: String)
}

// Pristatymas
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("Nepavyko įkelti duomenų")
        }
    }
}

// Modelis
class MainModel {
    fun getData(): String? {
        // Duomenų įkėlimas
        return "Pavyzdiniai duomenys"
    }
}

// Veikla (Vaizdo įgyvendinimas)
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
    }
}