Sobes.tech
Middle

Cuéntame más sobre el patrón MVP (Model-View-Presenter).

sobes.tech AI

Respuesta de la IA

MVP divide la aplicación en tres componentes interactivos:

  • Modelo: Gestiona los datos de la aplicación y la lógica de negocio. No depende de la interfaz de usuario.
  • Vista: Muestra los datos al usuario y procesa su entrada. Es pasiva y no contiene lógica de decisión.
  • Presentador: Actúa como intermediario entre Modelo y Vista. Recibe datos del Modelo y los formatea para la Vista. Responde a eventos de la Vista y actualiza el Modelo. La Vista se refiere al Presentador, y el Presentador a la Vista a través de una interfaz.

Ventajas de MVP:

  • Resistencia a cambios en la UI: La lógica está en el Presentador, que no depende de una implementación específica de la Vista.
  • Testabilidad: El Presentador es fácil de probar en aislamiento, sin necesidad de simular la UI.
  • Separación de responsabilidades: La clara división de roles entre componentes mejora la mantenibilidad del código.

Ejemplo:

// Interfaz de Vista
interface MainView {
    fun showData(data: String)
    fun showError(message: String)
}

// Presentador
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("Error al cargar los datos")
        }
    }
}

// Modelo
class MainModel {
    fun getData(): String? {
        // Carga de datos
        return "Datos de ejemplo"
    }
}

// Actividad (Implementación de la Vista)
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
    }
}