Documentos de Académico
Documentos de Profesional
Documentos de Cultura
09 Observer
09 Observer
Observer
Propsito
z
Observer
Motivacin
z
40
D
30
60
20
15
40
25
15
20
20
C
10
10
10
20
60
a:
b:
c:
d:
40%
25%
15%
20%
Notificacin de cambio
Consulta, modificacin
Observer
Aplicabilidad
z
Observer
Estructura
Subject
+ attach(Observer)
+ detach (Observer)
+ notify ()
ConcreteSubject
- subjectState
+ getState()
+ setState()
observers
0..1
Observer
+ update()
forall o in observers:
o.update();
subject
0..1
return subjectState;
ConcreteObserver
- observerState
+ update()
observerState = subject.getState();
Observer
Participantes
z
Subject:
z
z
Observer:
z
ConcreteSubject:
z
z
ConcreteObserver:
z
z
z
Observer
Colaboraciones
:ConcreteSubject
setState()
co1
:ConcreteObserver
co2
:ConcreteObserver
notify()
update()
getState()
update()
getState()
Observer
Colaboraciones
co
:ConcreteObserver
:ConcreteSubject
setState()
notify()
loop
Observer
Consecuencias
z
Observer
Implementacin
z
usar tabla hash: menor coste en espacio, pero mayor coste en tiempo
s1:Sujeto
s2:Sujeto
hash
intermedia
o:Observador
s3:Sujeto
s4:Sujeto
Observer
Implementacin
z
Observer
Implementacin
z
Soluciones:
z
z
Observer
Implementacin
z
Soluciones:
z
z
class ClaseSujetoBase {
void operacion (int valor) {
_miVar += valor;
}
void operacionNotify (int valor) {
self.operacion(valor);
//
self.notify();
//
}
}
class MiSujeto extends ClaseSujetoBase
void operacion (int valor) {
super.operacion(valor);
_miVar += valor;
}
}
ejecuta la operacin
dispara la notificacin
Observer
Implementacin
z
Observer
Implementacin
z
Subject
+ attach (Observer o)
+ detach (Observer)
+ notify ()
subjects
*
chman
1
ChangeManager
Subject-Observer mapping
Observer
+ update(Subject)
+ register (Subject,Observer)
+ unregister (Subject,Observer)
+ notify ()
chman.notify();
chman.register(this,o);
SimpleChangeManager
forall s in subjects:
forall o in s.observers:
o.update(s)
observers
+ register (Subject,Observer)
+ unregister (Subject,Observer)
+ notify ()
DAGChangeManager
+ register (Subject,Observer)
+ unregister (Subject,Observer)
+ notify ()
Observer
Ejemplo
Subject
+ attach(Observer)
+ detach (Observer)
+ notify ()
observers
1
Datasource
Fila
Observer
+ update()
Barras
Circular
- a, b, c, d: double
- data: double[4]
- a, b, c, d: double
- a, b, c, d: double
+ getState(): double[4]
+ setState(double[4]): void
+ update()
+ update()
+ update()
Observer
Cdigo de ejemplo
public abstract class Subject {
protected List<Observer> _observers;
public Subject() {
_observers =
new LinkedList<Observer>();
}
Observer
Cdigo de ejemplo
public abstract class Observer {
protected Subject _subject;
((Datasource)_subject).getState();
Observer
Cdigo de ejemplo
public abstract class Observer {
public abstract void update ();
}
Observer
En java
z
La interfaz java.util.Observer
z
La clase java.util.Observable
z
z
z
z
z
z
z
z
z
z
Observable()
void addObserver(Observer)
int countObservers()
void deleteObserver(Observer o)
void deleteObservers()
void notifyObservers()
void notifyObservers(Object arg)
boolean hasChanged()
void clearChanged()
void setChanged()