Sobes.tech
Middle

Πείτε περισσότερα για το μοτίβο MVP (Model-View-Presenter).

sobes.tech AI

Απάντηση από AI

Το MVP διαχωρίζει την εφαρμογή σε τρία αλληλεπιδρώντα συστατικά:

  • Μοντέλο: Διαχειρίζεται τα δεδομένα της εφαρμογής και τη λογική επιχειρήσεων. Δεν εξαρτάται από το περιβάλλον χρήστη.
  • Προβολή: Εμφανίζει τα δεδομένα στον χρήστη και επεξεργάζεται την εισαγωγή του. Είναι παθητική και δεν περιέχει λογική λήψη αποφάσεων.
  • Παρουσιαστής: Λειτουργεί ως μεσολαβητής μεταξύ Μοντέλου και Προβολής. Λαμβάνει δεδομένα από το Μοντέλο και τα μορφοποιεί για την Προβολή. Ανταποκρίνεται σε γεγονότα της Προβολής και ενημερώνει το Μοντέλο. Η Προβολή αναφέρεται στον Παρουσιαστή, και ο Παρουσιαστής στην Προβολή μέσω μιας διεπαφής.

Πλεονεκτήματα του MVP:

  • Αντοχή σε αλλαγές UI: Η λογική βρίσκεται στον Παρουσιαστή, ο οποίος δεν εξαρτάται από μια συγκεκριμένη υλοποίηση της Προβολής.
  • Δοκιμασιμότητα: Ο Παρουσιαστής είναι εύκολο να δοκιμαστεί σε απομόνωση, χωρίς να χρειάζεται να μιμηθεί το UI.
  • Διαίρεση ευθυνών: Η σαφής διαίρεση ρόλων μεταξύ των συστατικών βελτιώνει τη διαχειρισιμότητα του κώδικα.

Παράδειγμα:

// Διεπαφή Προβολής
interface MainView {
    fun showData(data: String)
    fun showError(message: String)
}

// Παρουσιαστής
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("Αποτυχία φόρτωσης δεδομένων")
        }
    }
}

// Μοντέλο
class MainModel {
    fun getData(): String? {
        // Φόρτωση δεδομένων
        return "Παραδείγματα δεδομένων"
    }
}

// Δραστηριότητα (Εφαρμογή της Προβολής)
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
    }
}