Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Vistas+Controladores = UI
Output View
Model
Input Controller
UI
Dinámica del MVC
1. Una entrada del usuario
es enviada por el SO
V
al controlador apropiado
2. El controlador puede M
requerir a la Vista que C
“tenga” el foco del
evento.
Dinámica del MVC
3. Controlador requiere
métodos del Modelo
V
para cambiar su estado
4. Modelo cambia su M
estado interno C
Dinámica del MVC
5. Modelo notifica a todas
las Vistas dependientes
V
que hay datos que se
modificaron M
6. Vistas requieren del C
Modelo los valores de los
datos actuales.
Dinámica del MVC
7. Modelo notifica a todos
los Controladores
V
dependientes que hay
datos que cambiaron.
M
8. Controlador requiere del C
Modelo los valores
actuales de los datos.
Dinámica del MVC
9. Controlador informa a
las Vistas si se
V
deshabilitan algunos
elementos. M
10. Vistas requieren C
redibujado
Patrón Observer
MVC es un patrón que puede ser expresado como una
combinación de otros patrones.
La interacción Modelo-Vista es generalmente descripta
usando el patrón Observer:
Define una dependencia uno a muchos entre objetos,
de forma tal que cuando uno de ellos (sujeto
Observable) cambia su estado, todos los que dependen
de éste (Observers) son notificados y actualizados
automáticamente.
Patrón Observer
Observers
Un sujeto puede tener cualquier cantidad de observadores
dependientes. Todos los observadores son notificados cuando el
sujeto experimenta un cambio en su estado. En respuesta a ello
cada observador interroga al sujeto para sincronizar su estado
con el de éste.
Java: Observer/Observable
java.util.Observable (Subject): Cualquier clase que desee
ser observada debe extender esta clase
métodos para add/delete Observers
métodos para notify todos los Observers de un cambio
(para indicar que hubo un cambio:setchanged)
Use Vector para almacenar las referencias a los Observers
java.util.Observer (interface) debe ser implementada por
cualquier clase que quiera actuar como Observer.
update() en respuesta a notifyObserver()
Modelo de delegación de eventos: la fuente de eventos es
Observable y los “listeners” de eventos son Observers.
Ejemplo
// Un sujeto a observar !
public class ConcreteSubject extends Observable {
private String name;
private float price;
public ConcreteSubject(String n, float p) {
name = n;
price = p;
System.out.println("ConcreteSubject creado: " + name + " a
"+ price);}
public setPrice(float p){price=p;//idem para setName
setChanged();//flag para indicar el cambio en Observable
notifyObservers(new Float(price));
} }
Ejemplo
// An observer of price changes. (Idem para observar nombre)
public class PriceObserver implements Observer {
private float price;
public PriceObserver() {price = 0;
System.out.println("PriceObserver creado: Precio es " + price);}
public void update(Observable obj, Object arg) {
if (arg instanceof Float) {price = ((Float)arg).floatValue();
System.out.println("PriceObserver: Precio cambia a " +
price);}}
Ejemplo
//Test
public class TestObservers {
public static void main(String args[]) {
// Create the Subject and Observers.
ConcreteSubject s = new ConcreteSubject("Corn Pops", 1.29f);
PriceObserver priceObs = new PriceObserver();
s.addObserver(priceObs);//registro del observer con Observable
s.setPrice(4.57f);
}}
Ejemplo
Salida del programa Test
ConcreteSubject creado: Corn Pops a 1.29
PriceObserver creado: Precio es 0.0
PriceObserver: Precio cambia a 4.57
MVC y Swing
Swing usa una arquitectura similar a MVC, llamada
Model-Delegate, muy difícil crear un controlador genérico
que no conozca los datos específico de una vista.
Colapsan Vista y Controlador (UI) en un único objeto
(UI delegate, puesto que la UI se delega a este objeto).
Se pueden usar múltiples vistas de un mismo modelo.
Componentes pueden compartir un mismo modelo.
(JScrollBar, JSlider, ProgressBar comparten el
BoundedRangeModel), permitiendo la conectividad
automática entre componentes.
MVC y Swing
View
View
Model
Model
Controller
Controller
Component UI-delegate
UI-delegate
MVC y Swing
MVC y Swing
Modelos en Swing
En Swing muchos de los modelos son interfaces
Ej.: ButtonModel, ListModel, TableModel
Usualmente existe un modelo “por defecto” que se asocia
automáticamente con un componente
DefaultButtonModel implementa ButtonModel
Muchas aplicaciones no necesitan preocuparse por ellos
Modelos en Swing
Casi todos los componentes proveen el API del modelo
directamente. El componente puede ser manipulado sin
interactuar con el modelo para nada.
//Ejemplo de la clase JSlider