Blog
Blog Author
Mikel Cantero
  • 22 de noviembre de 2025

Hemos explorado MVC y MVVM, patrones que buscan organizar la lógica de nuestras aplicaciones. Hoy nos adentraremos en otro patrón de interfaz de usuario fundamental: Model-View-Presenter (MVP). Este patrón es particularmente relevante cuando la Vista necesita ser más “pasiva” o cuando la testabilidad de la lógica de presentación es una prioridad máxima.

¿Qué es el Patrón Model-View-Presenter (MVP)?

MVP es una variación del patrón MVC que modifica la forma en que la Vista y el Modelo interactúan. Su principal diferencia radica en que la Vista es más pasiva y el Presenter asume gran parte de la lógica de presentación.

ComponenteRol Principal
Modelo (Model)Exactamente igual que en MVC: gestiona los datos y la lógica de negocio. Es independiente de la UI.
Vista (View)La interfaz de usuario (UI). Es completamente pasiva, no contiene lógica de presentación, solo muestra lo que el Presenter le dice y envía eventos de usuario al Presenter.
PresenterActúa como un intermediario entre el Modelo y la Vista. Contiene la lógica de presentación, decide qué mostrar en la Vista y reacciona a los eventos del usuario.

Diferencia Clave con MVC

En MVC, el Controlador a menudo interactúa directamente con la Vista y el Modelo. En MVP, el Presenter se encarga de toda la comunicación entre el Modelo y la Vista, lo que hace que la Vista sea muy sencilla.

MVP vs MVVM: Entendiendo la diferencia

Aunque MVP y MVVM buscan crear interfaces más testables, su mecanismo de comunicación es fundamentalmente distinto. La clave está en la relación entre el componente de control y la Vista:

  • En MVP, la comunicación es manual y explícita. El Presenter tiene una referencia directa a la Vista (a menudo implementando una interfaz) y le dice exactamente qué hacer, por ejemplo, llamando a un método como vista.mostrarMensaje("Éxito"). El flujo de información es directo y fuertemente acoplado (aunque la dependencia es sobre una interfaz, no sobre la implementación concreta de la UI).

  • En MVVM, la comunicación es automática gracias al Data Binding. El ViewModel no tiene conocimiento de quién lo está consumiendo. Simplemente expone propiedades (contador, listaUsuarios). La Vista se “adhiere” a estas propiedades, y el framework se encarga de la sincronización y actualización automática del DOM.

MVP es un patrón ideal si no tienes un framework que soporte Data Binding (como en algunas aplicaciones móviles o de escritorio legadas) o si necesitas un control muy estricto y explícito sobre la UI. MVVM es más moderno y eficiente en frontends web que ya ofrecen Data Binding de forma nativa.

El Problema que Resuelve MVP: Testabilidad y Separación Clara

El MVP busca resolver dos problemas principales:

  • Mejorar la Testabilidad de la Lógica de Presentación: Al hacer la Vista pasiva, toda la lógica de cómo se presentan los datos (formateo, habilitar/deshabilitar botones, etc.) se mueve al Presenter. Esto significa que el Presenter es fácilmente testeable con pruebas unitarias, sin necesidad de cargar una UI real.
  • Reducir la Lógica en la Vista: La Vista se vuelve una “interfaz tonta” que solo sabe mostrar y capturar eventos. Esto la hace más simple, reutilizable y fácil de mantener.

Caso de Uso: Un Formulario de Edición de Usuario

Imagina un formulario donde un usuario puede editar su perfil.

Flujo MVP:

  1. El usuario interactúa con la Vista (ej. rellena campos, hace clic en “Guardar”).
  2. La Vista notifica al Presenter sobre los eventos (ej. presenter.onSaveClicked()).
  3. El Presenter pide los datos a la Vista (ej. vista.getNombre(), vista.getEmail()).
  4. El Presenter interactúa con el Modelo para guardar los datos (ej. modelo.guardarUsuario(datos)).
  5. El Modelo responde al Presenter (éxito o error).
  6. El Presenter decide cómo actualizar la Vista (ej. vista.mostrarMensajeExito(), vista.mostrarErrores(errores)).

¡Importante! La Vista nunca interactúa directamente con el Modelo. El Presenter es el único intermediario.

Ejemplo (pseudocódigo)

// Interfaz de la Vista (lo que el Presenter espera de ella)
interface IUsuarioView {
    fun getNombre(): String
    fun setEmail(email: String)
    fun mostrarMensaje(mensaje: String)
    fun habilitarBotonGuardar(habilitar: Boolean)
}

// El Presenter (contiene la lógica de presentación)
class UsuarioPresenter {
    private val view: IUsuarioView
    private val model: UsuarioModel // El Modelo de datos/negocio

    constructor(view: IUsuarioView, model: UsuarioModel) {
        this.view = view
        this.model = model
    }

    fun cargarUsuario(id: Int) {
        val usuario = model.obtenerUsuario(id)
        view.setEmail(usuario.email)
        view.habilitarBotonGuardar(true) // Lógica de presentación
    }

    fun onGuardarClicked() {
        val nombre = view.getNombre()
        // Aquí iría validación y luego interacción con el modelo
        model.actualizarNombre(nombre)
        view.mostrarMensaje("Usuario guardado con éxito!")
        view.habilitarBotonGuardar(false)
    }
}

// La Vista (implementa la interfaz, es "tonta")
class UsuarioActivity : IUsuarioView {
    // Implementación de UI para getNombre, setEmail, etc.
    // Solo llama a presenter.onGuardarClicked() cuando el botón se presiona
}

MVP y las Arquitecturas Limpias / Hexagonales

Entender MVP nos lleva directamente a las arquitecturas más avanzadas como la Arquitectura Limpia (Clean Architecture) o la Arquitectura Hexagonal. Para un líder tecnológico, el valor de MVP en este contexto es la longevidad y la flexibilidad del sistema.

En estos patrones, el MVP (al igual que MVC o MVVM) se considera simplemente un detalle de entrega (un “adaptador de interfaz de usuario”). El objetivo principal es que la Lógica de Negocio (o el Core o Dominio de la aplicación) se mantenga completamente aislado e independiente de cualquier tecnología externa: del framework, de la base de datos, y de la interfaz de usuario.

El Principio de Aislamiento es la clave: el núcleo de tu aplicación (las reglas de negocio) no debe saber si es un Presenter, un Controlador o un ViewModel quien lo está llamando. El Presenter es la capa que se encarga de traducir los comandos del usuario (la UI) a las operaciones que entiende el Core de Negocio, y luego toma la respuesta del Core para formatearla y dársela a la Vista.

Esta estricta separación garantiza que, si decides cambiar el framework de la UI o incluso la naturaleza de la interfaz (por ejemplo, de una aplicación web a una aplicación de línea de comandos), puedes hacerlo sin reescribir la lógica de negocio central, protegiendo así la inversión más valiosa de tu código y preparando el sistema para la escalabilidad futura.

Conclusión

El patrón Model-View-Presenter es una herramienta poderosa, especialmente en aplicaciones donde la testabilidad de la UI es crítica o donde se desea una separación más estricta entre la presentación y la lógica. Al entender MVP, no solo aprendes otro patrón, sino que das un paso más hacia la construcción de sistemas robustos, flexibles y preparados para el futuro, donde tu lógica de negocio es el verdadero tesoro que debe ser protegido de los “detalles de entrega”.

Mis números

Información relevante

Años de experiencia
+ 7
Años de experiencia
Proyectos
13
Proyectos
Posts
33
Posts
Información de contacto

Zapopan, Jalisco, México

+52 33 2646 2099
Find us here