Vista vista = new Vista(controlador); modelo ... - Facultad de Informática
Juego ajedrez: control de eventos, algoritmo para pensar las jugadas, etc. 3. Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador ...
Federico Peinado www.federicopeinado.es Depto. de Ingeniería del Software e Inteligencia Artificial disia.fdi.ucm.es Facultad de Informática www.fdi.ucm.es Universidad Complutense de Madrid www.ucm.es
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
2
En
MVC cada elemento tiene tres partes:
• Un modelo que contiene los datos y la funcionalidad de
la aplicación
Juego ajedrez: estado del tablero, reglas del ajedrez, etc.
• Una vista que gestiona como se muestran esos datos Juego ajedrez: ventana que dibuja el tablero, oyentes de eventos, etc. • Un controlador que determina que modificaciones hay
que hacer en el modelo cuando se interacciona con la vista. También puede contener algoritmos
Juego ajedrez: control de eventos, algoritmo para pensar las jugadas, etc.
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
3
Es
posible tener diferentes vistas para un mismo modelo Es posible construir nuevas vistas sin necesidad de modificar el modelo subyacente Proporciona un mecanismo de configuración para componentes complejos mucho más tratable que el puramente basado en eventos (el modelo puede verse como una representación estructurada del estado de la interacción) Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
4
El modelo no debe ver a ninguna clase de los otros grupos: • Se podría cambiar de vista y controlador sin tocar el modelo
El controlador debe ver las clases del modelo, pero no de la vista el cambio de vista no afecta al controlador • En algunas variantes de la arquitectura el controlador puede ver a la
vista por si alguna acción del controlador afecta a la vista pero no al modelo (e.g. mensaje de error)
La vista no debe ver las clases del modelo el cambio de modelo no afecta a la vista • En algunas variantes la vista ve al modelo para consultarle
información, pero nunca para realizar cambios en él
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
5
Para que la vista se entere de los cambios producidos en el modelo, se utiliza el patrón Observer
• La vista se registra como oyente/observador del modelo
Cuando se produce un cambio en el modelo (setDatos(datos:TDatos)):
• Se llama al método notificarXXXX() Normalmente los métidos notificarXXXX() son protegidos o privados. • notificar() llama al método actualizarXXX() de
todos los observadores registrados
A veces se utilizan otros nombres para actualizarXXXX() como XXXXPerformed()
• Los métodos actualizar() se encargan de actualizar las
respectivas vistas
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
6
Los oyentes se pueden seguir implementando como clases internas de la vista • Dentro de los manejadores se llamarán a métodos del controlador
Los métodos notificar y actualizar se pueden desdoblar para distintos tipos de actualizaciones en la vista
Conviene separar en 3 paquetes las clases correspondientes a cada parte de la arquitectura
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
7
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
8
Para
arrancarlo todo en el método main:
Modelo modelo = new Modelo(); Controlador controlador = new Controlador(modelo); Vista vista = new Vista(controlador); modelo.añadirObservador(vista);
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
9
Esta arquitectura tiene aún más justificación si tenemos varias vistas • A través de los observadores registrados en el modelo se actualizan las distintas
vistas cuando se producen cambios en el modelo. modelo.añadirObservador(vista1); modelo.añadirObservador(vista2);
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
10
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
11
public class Aplicación { public static void main(String args[]) { Modelo modelo = new Modelo(); Controlador controlador = new Controlador(modelo); Vista1 vista1 = new Vista1(controlador); Vista2 vista2 = new Vista2(controlador); Vista1 otraVista1 = new Vista1(controlador); Vista2 otraVista2 = new Vista2(controlador);
Class Observable (java.util) • Tiene un flag interno que indica si el objeto observable ha
cambiado o no • Métodos:
void addObserver(Observer obs): Añade un observador a la lista void deleteObserver(Observer obs): Quita un observador de la lista void setChanged(): Marca el objeto observable como cambiado void notifyObservers(Object o): Si el objeto observable ha cambiado, llama al método update de todos los observadores. Vuelve a dejar el objeto observable como no cambiado
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
14
Las vistas deben implementar el interfaz Observer • Por tanto, deben implementar el método update
El modelo debe heredar de Observable • No necesita un atributo con la lista de observadores • No necesita implementar los métodos para añadir y
eliminar observadores • No necesita implementar ningún método notificar • Cuando se produzca un cambio en el modelo (setDatos(datos:TDatos)) hay que:
Actualizar el modelo Indicar que el modelo ha cambiado llamando a setChanged() Notificar a todos los observadores registrados el cambio producido en el modelo llamando a notifyObservers(Object o) Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
15
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
16
public class Aplicación { public static void main(String args[]) { Modelo modelo = new Modelo();
Controlador controlador = new Controlador(modelo); Vista1 vista1 = new Vista1(controlador); Vista2 vista2 = new Vista2(controlador);
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
17
public class Modelo extends Observable { private int valor; // Datos public void setValor(int nuevoValor) { valor = nuevoValor; // indica que el modelo ha cambiado this.setChanged(); this.notifyObservers(new Integer(valor)); }
} Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
18
public class Controlador { private Modelo modelo; public Controlador (Modelo unModelo){ modelo = unModelo; } public void fijarValor(int valor) throws ExcepcionRango {
if ((valor > 16) || (valor < 0)) throw new ExcepcionRango();
}
}
modelo.setValor(valor);
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
19
public class Vista1 extends Jframe implements Observer { private Controlador controlador; (...) public Vista1(Controlador unControlador){ controlador = unControlador; configurarComponentes(); configurarManejadoresEventos(); } public void configurarManejadoresEventos() { //Crea Oyentes locales de la interfaz //Los oyentes invocan métodos del controlador }
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
20
public void update(Observable o, Object valor){ //Actualización de la interfaz } public class OyenteVista1 implements ActionListener {
public void actionPerformed(ActionEvent e){ //Procesamiento del evento (...)
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
21
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
22
Existen múltiples variaciones e interpretaciones • Lo importante es separar los tres elementos
Problemas típicos: • ¿El usuario interactúa con el controlador?
El usuario puede considerarse parte de la vista Un servidor remoto puede ser parte de la vista • ¿El controlador envía información a la vista?
Puede interesar enviar información directamente a la vista desde el controlador (mostrar mensajes de error) Pero entonces el controlador necesita una lista de vistas • ¿La vista accede al modelo para preguntar el estado?
La vista puede tener una replica del modelo y actualizarla Los eventos pueden llevar una referencia del estado La vista puede tener una referencia al modelo para hacerle preguntas ¡Pero nunca para cambiarlo!
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
23
Vista Modelo m Control c
Modelo (datos)
Controlador Modelo m Vista v
¡Interfaces claros!
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
24
Vista Modelo m Control c
Modelo (datos)
Controlador Modelo m Vista v
¡Interfaces claros!
El controlador actúa de mediador en todas las comunicaciones Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
25
En Swing se utiliza una adaptación de esta arquitectura de modo que la vista y el controlador se agrupan en el componente (Delegado) pero el modelo se mantiene separado permitiendo comportamientos muy sofisticados • Por ejemplo, como los modelos gestionan y almacenan los datos existe la
posibilidad de compartir un mismo modelo entre varios componentes. Cada uno de los componentes puede modificar el modelo y dicha modificación se reflejará de forma automática en el resto de los componentes que comparten dicho modelo • Estos modelos de datos son especialmente importantes en los componentes que trabajan con texto y en las listas
El modelo se consulta y actualiza con métodos get / set (donde depende del tipo de componente)
El delegado se consulta/actualiza con los métodos getUI / setUI
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
26
Componente Swing
Vista
Modelo
Controlador delegado
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
27
public class ModeloCompartido { JTextArea areaTexto1, areaTexto2; JFrame ventana; Document documento; public ModeloCompartido(String titulo){ ventana = new JFrame(titulo); Container panelContenido = ventana.getContentPane(); areaTexto1= new JTextArea(10,100); documento=areaTexto1.getDocument(); areaTexto2= new JTextArea(documento); areaTexto2.setColumns(100); areaTexto2.setRows(10); panelContenido.setLayout(new BoxLayout(panelContenido, BoxLayout.Y_AXIS)); panelContenido.add(new JScrollPane(areaTexto1)); panelContenido.add(Box.createGlue()); panelContenido.add(new JScrollPane(areaTexto2)); panelContenido.add(Box.createGlue()); ventana.setSize(500, 300); ventana.setVisible(true); } public static void main(String args[]) { ModeloCompartido aplicacion = new ModeloCompartido("Prueba documento compartido"); } }//ModeloDocumentoCompartido
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
28
Laboratorio de Programación de Sistemas – Patrón Modelo-Vista-Controlador
4Life Transfer Factor VISTA está especialmente formulado para reforzar tu programa de bienestar general. Además de vitaminas A, E y C, zinc, extracto de baya de arándano, extracto de baya de grosella negra y otros ingredientes. Contiene luteína y zea
contribuyente (Ej.: Me compré una casa muy cara y la vendo ahora que el precio de la vivienda ha bajado. Por lo tanto le he perdido dinero a la casa y pago ...
Avulsión: es de forma violenta. Si hay un desprendimiento. (cosa accesoria) del fundo de Charo y va a parar a mi fundo, este trozo se incorpora definitiva e ...
le puede aplicar el concepto universal. Naturalmente, la ... infinita, sino que ha de admitirse la existencia de un primer motor que no es movido por ningún otro.
Two installer configurable zone types allows the installer to "create custom zone types" by assigning all zone attributes. • Multiple actions on output devices.
Con Justiniano entre el raptor y la raptada. El cuarto tipo de impedimento son los conocidos por motivos sociales o éticos. Según determinadas épocas va a ...
Modos de Imagen. Doppler color y pulsado. Doppler poder. Modo M ... Cardiología. Transductor en Fase 2-4MHz. Módulo de Doppler Continuo con cables para ...
Dado que en Secundaria surge el ``pensamiento formal´´ en nuestros alumnos, una de las repercusiones sobre nuestra labor de profesor de EF en esa etapa ...
Bibliografía: Maynar (2007), Cap. 5. 1. Introducción ... ejemplo, cuando una cadena hotelera va a abrir un hotel nuevo, hay determinados valores que podemos ...
SECCION 1: VISTA LONGITUDINAL. CASA TIPO O3 MPERA. CLIENTE ESCALA Nº CAPA. TRIVENTO FECHA. CE 3AN VCEN 23 pE eEPTEMPRE DE 222. | Nombre Nombre cm, proyecTu. Diseño TRIVENTA2 DE eAN VICENTE. A lº E. F. S. A. Reviso. 3.353 3 331 cºn la Prºyectºs, 3 ..
balón de reglamento y lanzárselo a la cara con todas mis ganas y sin apenas tiempo de arrepentirme de mi locura. Bueno, sÃ, en cuanto la pelota se despegó ...
24 jun. 2016 - Un paraíso por el día, un trocito de Cuba por la noche, donde puedes ... Para los amantes de la buena gastronomía, de las emociones fuertes, ...
La barra de la figura, con sección A y módulo de elasticidad E, está unida a un muelle de rigidez. L. EA k. 3. = . Obtenga el diagrama de esfuerzos normales en ...
grandes proveedores, llamados tier 1 o Internet Backbone Provider (IBP), sólo dan acceso a proveedores tier 2 o compañías muy grandes. Los tier 1 tienen ...
28 feb. 2014 - Operadora Vista Hermosa S.A. de C.V., operadora de Hotel Vista. Hermosa, con domicilio en Río Pánuco 600, col. Vista Hermosa, Cuernavaca,. Mor.; es responsable de recabar sus datos personales, del uso que se le dé a los mismos y de su
la Copa Intercontinental William Jones, que Real Madrid le ganó a Obras Sani- tarias), también se ... en el banco con. Luis Scola 3. El Luna. Park lució a pleno.
que ha solicitado, informarle sobre cambios en los mismos y evaluar la calidad del ... como sensible según la Ley Federal de Protección de Datos Personales en ... Cualquier modificación a este aviso de privacidad podrá consultarla en.