Modelo - Vista - Controlador en Java
¿Qué es MVC?
El patrón Modelo-Vista-Controlador (MVC) es un patrón de diseño de software que divide una aplicación en tres componentes principales:
- Modelo: Contiene los datos y la lógica de negocio. El modelo se encarga de acceder a la base de datos, procesar datos, aplicar reglas de negocio y notificar a las vistas sobre los cambios en los datos.
- Vista: Presenta los datos del modelo al usuario. En una aplicación de escritorio, la vista sería la interfaz gráfica de usuario (GUI). La vista muestra la información y recibe la entrada del usuario, pero no realiza operaciones lógicas sobre los datos.
- Controlador: Actúa como intermediario entre el modelo y la vista. Responde a las entradas del usuario (por ejemplo, clics de botón), manipula el modelo y actualiza la vista.
¿Para qué sirve?
El patrón Modelo-Vista-Controlador (MVC) sirve para varios propósitos clave en el desarrollo de software.
- Separación de Responsabilidades
- Facilita la Prueba
- Flexibilidad y Reusabilidad
- Desarrollo Paralelo
- Desarrollo Paralelo
- Mejora la Mantenibilidad
- Soporte para Interfaces de Usuario Múltiples
¿Cómo se comunican entre sí?
El patrón Modelo-Vista-Controlador (MVC) se basa en la comunicación entre sus tres componentes principales: Modelo, Vista y Controlador. Vamos a desglosar cómo se comunican estos componentes para entenderlo mejor:
- Modelo a Vista
- Mecanismo: El Modelo notifica a las Vistas suscritas cuando hay un cambio en los datos.
- Ejemplo: Imagina una aplicación de gestión de inventario. Cuando se añade un nuevo producto al inventario (Modelo), el Modelo notifica a la Vista de lista de productos para que actualice la visualización.
- Vista a Controlador:
- Mecanismo: La Vista detecta las acciones del usuario (como clics en botones, entradas de texto) y notifica al Controlador. Esto generalmente se hace mediante el manejo de eventos.
- Ejemplo: En una aplicación de correo electrónico, cuando el usuario presiona el botón "Enviar" (Vista), esta acción se notifica al Controlador correspondiente, que luego procesa la solicitud.
- Controlador a Modelo:
- Mecanismo: El Controlador interactúa directamente con el Modelo, enviando comandos para modificar los datos, basados en la interacción del usuario.
- Ejemplo: Siguiendo con la aplicación de correo electrónico, el Controlador tomará la acción de "Enviar" y actualizará el Modelo para añadir el nuevo correo electrónico al conjunto de datos enviados.
- Controlador a Vista:
- Mecanismo: Aunque el Controlador no actualiza directamente la Vista, puede enviar comandos para cambiar la presentación o el estado de la Vista.
- Ejemplo: En una aplicación de juego, si el jugador pierde una vida, el Controlador puede instruir a la Vista para que muestre un mensaje de "Vida Perdida" o actualice la representación gráfica de las vidas restantes.
Veamos todo esto con un ejemplo completo. Imagina una aplicación de lista de tareas (TODO List) Tenemos los siguientes componentes: - Modelo: Contiene una lista de tareas - Vista: Muestra las tareas en una lista en la interfaz de usuario - Controlador: Gestiona la adición de nuevas tareas
Ahora vamos a simular la ejecución del programa:
- Cuando el usuario escribe una nueva tarea y presiona "Añadir" (Vista), esta acción se comunica al Controlador.
- El Controlador procesa esta acción y añade la nueva tarea al Modelo.
- El Modelo, al ser actualizado, notifica a la Vista (o Vistas) de la lista de tareas que hay un cambio.
- La Vista, al recibir la notificación, se actualiza mostrando la nueva tarea añadida.
Ejemplo
Vale, nos dejamos de lío y vamos a la práctica. En este ejemplo vamos a ver como implementar MVC usando Java Swing pero tiene muchas más utilidades. Esta aplicación básica permite a un usuario actualizar un mensaje y ver el mensaje actualizado en la interfaz de usuario.
- Modelo: El Modelo almacena los datos. En este caso, simplemente guardará un mensaje.
public class MensajeModelo {
private String mensaje;
public String getMensaje() {
return mensaje;
}
public void setMensaje(String mensaje) {
this.mensaje = mensaje;
}
}
- Vista: La Vista muestra la representación visual de los datos. Aquí, creamos una simple interfaz de usuario con un campo de texto y un botón.
import javax.swing.*;
public class MensajeVista extends JFrame {
private JTextField txtMensaje = new JTextField(20);
private JButton btnActualizar = new JButton("Actualizar");
public MensajeVista() {
JPanel panel = new JPanel();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(300, 200);
panel.add(txtMensaje);
panel.add(btnActualizar);
this.add(panel);
}
public String getMensaje() {
return txtMensaje.getText();
}
public void setMensaje(String mensaje) {
txtMensaje.setText(mensaje);
}
public void addActualizarListener(ActionListener escucharParaBoton) {
btnActualizar.addActionListener(escucharParaBoton);
}
}
- Controlador: El Controlador maneja la lógica que responde a las acciones del usuario y actualiza el Modelo.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MensajeControlador {
private MensajeModelo modelo;
private MensajeVista vista;
public MensajeControlador(MensajeModelo modelo, MensajeVista vista) {
this.modelo = modelo;
this.vista = vista;
this.vista.addActualizarListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
modelo.setMensaje(vista.getMensaje());
vista.setMensaje(modelo.getMensaje());
}
});
}
}
- Principal: Aquí es donde se conectan el Modelo, la Vista y el Controlador.
public class MVCEjemplo {
public static void main(String[] args) {
MensajeModelo modelo = new MensajeModelo();
MensajeVista vista = new MensajeVista();
MensajeControlador controlador = new MensajeControlador(modelo, vista);
vista.setVisible(true);
}
}+