Documentos de Académico
Documentos de Profesional
Documentos de Cultura
09 Observer PDF
09 Observer PDF
A B C D 40
D
30
A
X 60 20 15 5 20
C
10
Y 40 25 15 20 B
0
A B C D
Z 10 10 20 60
a: 40%
b: 25%
c: 15% Notificación de cambio
d: 20% Consulta, modificación
Observer
Aplicabilidad
z Usa el patrón Observer:
subject
ConcreteSubject ConcreteObserver
0..1
- subjectState - observerState
+ getState() return subjectState; + update()
+ setState()
observerState = subject.getState();
Observer
Participantes
z Subject:
z conoce a sus observadores, que pueden ser un número arbitrario
z proporciona una interfaz para añadir y quitar objetos observadores
z Observer:
z define la interfaz de los objetos a los que se deben notificar
cambios en un sujeto
z ConcreteSubject:
z almacena el estado de interés para sus observadores
z envía notificaciones a sus observadores cuando su estado cambia
z ConcreteObserver:
z mantiene una referencia a un ConcreteSubject
z almacena el estado del sujeto que le resulta de interés
z implementa la interfaz de Observer para mantener su estado
consistente con el del sujeto
Observer
Colaboraciones
update()
getState()
update()
getState()
:ConcreteSubject co
:ConcreteObserver
setState()
notify()
s1:Sujeto hash
intermedia
s2:Sujeto
o:Observador
s3:Sujeto
z Soluciones:
z documentar los métodos que envían notificaciones
z patrón de diseño Template Method
Observer
Implementación
z Asegurarse de la consistencia del sujeto antes de una notificación
z Soluciones:
z documentar los métodos que envían notificaciones
z patrón de diseño Template Method
los clientes llaman a operacionNotify
class ClaseSujetoBase {
en vez de a operacion
void operacion (int valor) {
_miVar += valor;
}
void operacionNotify (int valor) {
self.operacion(valor); // ejecuta la operación
self.notify(); // dispara la notificación
}
}
class MiSujeto extends ClaseSujetoBase {
void operacion (int valor) {
super.operacion(valor);
_miVar += valor;
}
}
Observer
Implementación
z Evitar protocolos de actualización específicos del observador
z Modelo pull: el sujeto envía lo mínimo, los observadores piden lo necesario
z inconveniente: puede ser poco eficiente
z Modelo push: el sujeto envía información detallada del cambio, aunque los
observadores no la necesiten.
z inconveniente: observadores menos reutilizables
class Subject {
public attach (Observer o, Aspect a) { ... }
}
class Observer {
public update (Subject s, Aspect a) { ... }
}
Observer
Implementación
z Encapsular la semántica de actualizaciones complejas
z Cuando la relación de dependencia entre sujetos y observadores es
compleja, se puede usar un objeto intermedio para la gestión de cambios
z Minimiza el trabajo de reflejar cambios de los sujetos en los observadores
z Ej.: si se actualizan varios sujetos, hay que asegurar que los observadores
se actualizan sólo después del cambio en el último sujeto
SimpleChangeManager DAGChangeManager
forall s in subjects: + register (Subject,Observer) + register (Subject,Observer)
forall o in s.observers: + unregister (Subject,Observer) + unregister (Subject,Observer)
o.update(s) + notify () + notify ()
Observer
Ejemplo
observers
Subject Observer
1 *
+ attach(Observer) + update()
+ detach (Observer)
+ notify ()
z La clase java.util.Observable
z Observable()
z void addObserver(Observer)
z int countObservers()
z void deleteObserver(Observer o)
z void deleteObservers()
z void notifyObservers()
z void notifyObservers(Object arg)
z boolean hasChanged()
z void clearChanged()
z void setChanged()