> For the complete documentation index, see [llms.txt](https://educacion.gitbook.io/programacion/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://educacion.gitbook.io/programacion/ud5-entrada-e-saida-da-informacion/interfaces-graficas/modelo-vista-controlador.md).

# Modelo Vista Controlador

O Modelo-Vista-Controlador é un patrón de arquitectura de software amplamente utilizado no desenvolvemento de aplicacións de software, especialmente en aplicacións web e de escritorio. O seu obxectivo principal é dividir unha aplicación en tres compoñentes principais, cada un cunha responsabilidade específica. Estes tres compoñentes son:

* **Modelo (Model):** O Modelo representa os datos e a lóxica de negocio da aplicación. Noutras palabras, é a parte da aplicación que manexa o almacenamento e a manipulación dos datos. Isto pode incluír bases de datos, arquivos, API externas ou calquera outra fonte de datos. O Modelo é independente da interface de usuario e non sabe nada acerca de cómo se mostrarán os datos. O modelo implementarse no nos caso **mediante as capas de Servicio e DAO**
* **Vista (View):** A Vista é a capa encargada da presentación dos datos ao usuario. Representa a interface de usuario e encárgase de mostra-los datos ó usuario dunha maneira comprensible e atractiva. A Vista non debe conter lóxica de negocio; simplemente mostra os datos que recibe do Modelo e envía as interaccións do usuario ao controlador.
* **Controlador (Controller):** O controlador actúa como intermediario entre o Modelo e a Vista. Responde ás interaccións do usuario na interface de usuario e encárgase de actualizar o Modelo en consecuencia. Tamén se encarga de tomar datos do Modelo e pasalos á Vista para a súa presentación. O controlador contén a lóxica de negocio da aplicación e decide cómo se deben manexar as solicitudes e as accións do usuario.

A principal vataxe do patrón MVC é a separación de preocupacións. Dividir unha aplicación nestes tres compoñentes facilita a modificación e o mantemento do código, xa que os cambios nun compoñente non deberían afectar os outros. Ademais, promove a reutilización de código, xa que é posible usar o mesmo Modelo con diferentes vistas ou diferentes controladores

{% @mermaid/diagram content="graph TD
%% Definición de componentes - Usuario y Vista arriba
U\[Usuario] -->|1. Interactúa| V\[VISTA<br/>Interfaz de usuario]
V -->|2. Envía eventos| C\[CONTROLADOR<br/>Coordina vista y modelo]
C -->|3. Consulta/Modifica| M

```
subgraph M[MODELO]
    direction TB
    S[SERVICE]
    D[DAO]
    E[ENTITY]
end

M -->|4. Devuelve datos| C
C -->|5. Notifica cambios| V
V -->|6. Actualiza pantalla| U

%% Estilo visual
classDef vista fill:#e1f5fe,stroke:#01579b,stroke-width:2px
classDef controlador fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef modelo fill:#e8f5e8,stroke:#1b5e20,stroke-width:2px
classDef sub fill:#c8e6c9,stroke:#1b5e20,stroke-width:1px
classDef usuario fill:#f3e5f5,stroke:#4a148c,stroke-width:2px

class V vista
class C controlador
class M modelo
class S,D,E sub
class U usuario" %}
```

## Exemplo de MVC

```java
package exemploMVC;

import java.time.LocalDateTime;

public class Servicio {
    public String funciónServicio() {
        return LocalDateTime.now().toString();
    }
}

```

```java
package exemploMVC;

import javax.swing.*;

public class Vista extends JFrame {

    private JButton boton;
    private JLabel etiqueta;

    public Vista() {
        setTitle("Exemplo MVC");
        setSize(300,200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(null);

        boton = new JButton("Preme aquí");
        boton.setBounds(80,40,120,40);

        etiqueta = new JLabel("Sen resposta");
        etiqueta.setBounds(80,100,200,30);

        add(boton);
        add(etiqueta);

        setVisible(true);
    }

    public JButton getBoton() {
        return boton;
    }

    public JLabel getEtiqueta() {
        return etiqueta;
    }

    public void setTextoEtiqueta(String texto){
        this.etiqueta.setText(texto);
    }
}

```

```java
package exemploMVC;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

    public class Controlador {

        private Servicio servicio;
        private Vista vista;

        public Controlador(Servicio servicio, Vista vista) {
            this.servicio = servicio;
            this.vista = vista;

            vista.getBoton().addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {

                    String resultado = servicio.funciónServicio();
                    vista.setTextoEtiqueta(resultado);

                }
            });
        }
    }
```

```java
package exemploMVC;

public class App {
    public static void main(String[] args) {
        Servicio servicio = new  Servicio();
        Vista vista = new Vista();
        Controlador controlador = new Controlador(servicio,vista);
    }
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://educacion.gitbook.io/programacion/ud5-entrada-e-saida-da-informacion/interfaces-graficas/modelo-vista-controlador.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
