Está en la página 1de 17

Fundamentos de Ingeniería del Software

INTRODUCCIÓN AL
MODELO – VISTA - CONTROLADOR
Vicente García Díaz
garciavicente@uniovi.es

Vicente García Díaz


César Fernández Acebal
Juan Manuel Cueva Lovelle
Escuela de Ingeniería Informática
Universidad de Oviedo
Curso 2010-2011
Esquema básico del MVC
2

Vista Totalmente independientes. Modelo


Ninguno sabe de la existencia
del otro

Capa de presentación
Capa de negocio y de
acceso a datos
Controlador

El Controlador es el único que sabe


cómo funciona la Vista y el Modelo
¿Cuál es la clave para lograrlo?
3

 Los patrones de diseño


 El MVC es un patrón de diseño compuesto
 Patrón de diseño Strategy
 El controlador implementa diferentes estrategias
 Patrón de diseño Observer
 El controlador, y a veces, la vista observan continuamente al
modelo
 Patrón de diseño Composite
 La vista suele implementar dicho patrón internamente para
facilitar el trabajo de mostrar la interfaz
 Otros patrones como Adapter, Command o Facede
también tienen cabida con MVC
Para esta introducción no será necesario
conocer estos patrones…aunque es muy
recomendable, sobre todo el Observer
Ejemplo de empleo del MVC
4

 Aplicación Java muy sencilla realizada con Swing

Aquí nos dice en qué


emisora estamos

Retroceso de emisora Avance de emisora

Cuando se enciende la radio, se puede


cambiar de emisora. Si la radio está apagada,
entonces no se puede hacer nada
Proyecto JAVA
5

Lanzamiento del programa

Controlador
Controlador
Interfaz para que el Controlador pueda observar
Es un enumerado que indica al
Controlador qué ha cambiado del modelo

Modelo Interfaz para que el Modelo pueda ser observado

Modelo

Vista Vista (creada con Swing)

El Controlador observa al Modelo.


Para ello utilizaremos el patrón de
diseño Observer. Es la clave de MVC!
El lanzamiento del programa
6

Sólo hay que instanciar al Controlador. …aunque podría ser mucho más
Él es el que lo gestiona todo! O lo que sofisticado. Por ejemplo, podrían
es lo mismo, el Controlador puede verse incluirse parámetros de configuración
como el punto de entrada al programa o una instancia del Model0 que se
utilizará
El modelo
IObservable.java
7

La clase Model implementa esta interfaz  El Modelo puede ser OBSERVADO

addObserver sirve para que el Modelo notifyObserver sirve para que el Modelo
pueda tener internamente diferentes notifique a todos los elementos que lo
“observadores”. Es decir, el Modelo es un están observando (todos los que han sido
IObservable, y al Modelo lo observan pasados a addObserver previamente) que
elementos que hayan implementado la algo ha cambiado en el sistema (e.g. un
interfaz IObserver. usuario se logea, ocurre un fallo, etc…)

Así, cualquier objeto que haya implementa En este caso, se utiliza un enumerado
la interfaz IObserver puede ser el UpdateInfo con diferentes valores en
parámetro que se le pasa al método función de qué ha ocurrido
El modelo
Model.java (1/2)
8

Típico constructor

Se añaden observadores

Cuando se invoca este


método, se avisa (notifica) a
todos los observadores de
algún cambio importante en
el Modelo
Sigue en la siguiente diapositiva
El modelo
Model.java (2/2)
9

Cuando se enciende la radio, el


Modelo “busca” 8 emisoras de radio
y las guarda en su “memoria”.
Además notifica a los observadores
cuando finaliza su proceso

En este caso, apagar la radio es


directo. Notifica a los
observadores directamente
Cuando se avanza de emisora y se
llega al límite de 8, se vuelve a la
primera. Luego, notifica a sus
observadores

Análogo para cuando se retrocede


de emisora

Aquí, el Modelo devuelve la emisora


actual. No se lo notifica a nadie,
simplemente porque no se consideró
importante hacerlo en este caso
La vista
View.java (1/2)
10

El Vista guarda una referencia al


Controlador. Muy importante porque la
Vista delega al Controlador la
responsabilidad de ejecutar los métodos
oportunos del Modelo. ¿Por qué? porque
la Vista no conoce al Modelo y el Modelo
no conoce a la Vista. El único que conoce
a ambos es el Controlador. Esta es la
clave de la independencia en el diseño

La Vista ni siquiera sabe lo que


significan sus botones. Así, se permite
que diferentes Controladores invoquen
diferentes funcionalidades en
diferentes Modelos (o en el mismo) La
Vista únicamente ofrece métodos para
utilizar los elementos de la interfaz
¿Cómo se usan dichos elementos? Eso
es responsabilidad del Controlador

Sigue en la siguiente diapositiva


La vista
View.java (2/2)
11

Se delega al Controlador
la responsabilidad de
invocar el método
oportuno en el Modelo
ante los diferentes
eventos de usuario que
pueden existir al accionar
los botones de la interfaz.
La Vista no sabe qué
sucede cuando un
usuario invoca un evento,
sólo sabe que lo ha
invocado

*** La interfaz está hecha


con Swing para este ejemplo
y los ActionPerformed son
los eventos producidos por
el usuario
El controlador
IObserver.java
12

La clase Controller implementa esta interfaz  El Controlador es un OBSERVADOR

update es el método que se llama para cada uno de los observadores


cuando el Modelo invoca al método notifyObserver. A update se le
pasa un valor de un enumerado UpdateInfo, que sirve para especificarle
al Controlador qué es lo que ha cambiado del Modelo
El controlador
UpdateInfo.java
13

Con este enumerado, el Modelo le puede decir al Controlador si lo que ha cambiado en


el sistema es que se ha encendido la radio, si se ha apagado o si se ha cambiado la
emisora actual que se estaba escuchando…

O lo que es lo mismo, el Modelo avisa a todos los que lo observan de sus cambios
internos más significativos (podrían ser otros cambios en lugar de los 3 del
ejemplo)
El controlador El Controlador es el único que
Controller.java (1/2) conoce a la Vista y al Modelo
14
Esto permite una total
independencia entre Vista y
Modelo. Sin embargo, el
Controlador suele ser un
componente bastante sencillo (es
Muy importante!! únicamente un mediador entre
Vista y Modelo). Así, realizar
cambios en el comportamiento de
una Vista con un Modelo es
relativamente sencillo. Además,
no habría que tocar ni la Vista, ni
el Modelo, componentes más
complejos con el Controlador

Cuando el Modelo notifica al


Controlador, el Controlador
decide hacer “cosas” con la Vista
¿Qué cosas? las que el
Controlador quiera en función de
los métodos que le ofrezca la
Vista
El controlador
Controller.java (2/2)
15

En este caso, el trabajo del Controlador es


muy sencillo. Cuando la Vista invoca a un
método del Controlador, éste únicamente
tiene que invocar al método de igual
nombre del Modelo. Sin embargo, en la
práctica no siempre será así. Es muy normal
que el Controlador haga algún tipo de
procesamiento aunque sea pequeño

Por ejemplo, la Vista le podría pasar al


Controlador la orden SubirVolumen. Si el
Modelo tuviera un nivel de volumen desde 0
hasta 100, el Controlador podría, por
ejemplo, invocar un método del Modelo
como SubirVolumen(5), indicando que
cuando la Vista pide SubirVolumen, el
Modelo debe hacerlo de 5 en 5 unidades
Capacidad de adaptación del MVC
16

 El MVC tiene múltiples implementaciones. Algunas:


 .NET ASP.NET MVC http://mvc.asp.net

 JAVA  Spring MVC http://www.springsource.org/

 PHP  Zend Framework http://framework.zend.com/

 Ruby  Ruby on Rails http://rubyonrails.org/


Al igual que todos los
 Permite adaptaciones patrones de diseño…
 Habría que utilizar interfaces, no implementaciones
 El modelo podría ser un parámetro del controlador
 La vista observa directamente al modelo
 La vista accede directamente a algún getter del modelo
 Empleo de múltiples controladores para subsistemas
etc…
Bibliografía
17