Sobes.tech
Middle

Meséljen részletesebben az MVP (Model-View-Presenter) mintáról.

sobes.tech MI

Válasz az MI-től

Az MVP az alkalmazást három kölcsönhatásban lévő komponensre osztja:

  • Model: Kezeli az alkalmazás adatait és az üzleti logikát. Nem függ a felhasználói felülettől.
  • View: Megjeleníti az adatokat a felhasználónak és feldolgozza a bemenetét. Passzív, és nem tartalmaz döntéshozó logikát.
  • Presenter: Közvetítőként működik a Model és a View között. Adatokat kap a Model-től, és formázza azokat a View számára. Reagál a View eseményeire, és frissíti a Modelt. A View a Presenter-re, a Presenter pedig a View-ra hivatkozik egy interfészen keresztül.

A MVP előnyei:

  • UI változásokkal szembeni ellenállás: A logika a Presenter-ben található, amely nem függ egy adott View implementációjától.
  • Tesztelhetőség: A Presenter könnyen tesztelhető izoláltan, anélkül, hogy a UI-t mock-olni kellene.
  • Felelősségek szétválasztása: A komponensek közötti világos szereposztás javítja a kód karbantarthatóságát.

Példa:

// View interfész
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("Hiba az adatok betöltésekor")
        }
    }
}

// Model
class MainModel {
    fun getData(): String? {
        // Adatok betöltése
        return "Példa adatok"
    }
}

// Tevékenység (View implementáció)
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
    }
}