Fundamentos de Ingeniería del Software
INTRODUCCIÓN AL
MODELO – VISTA - CONTROLADOR
Vicente García Díaz
[email protected]
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