












Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Los mejores documentos en venta realizados por estudiantes que han terminado sus estudios
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Descubre las mejores universidades de tu país según los usuarios de Docsity
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Patron de Diseño Observer, propositos y ejemplos codificados
Tipo: Diapositivas
1 / 20
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!
Técnicas de Programación - Curso 2008/
(Esther Guerra Sánchez)
Cuando una abstracción tiene dos aspectos, y unodepende del otro. Encapsular los aspectos en objetosdistintos permite cambiarlos y reutilizarlos.
Cuando cambiar un objeto implica cambiar otros, perono sabemos exactamente cuántos hay que cambiar
Cuando un objeto debe ser capaz de notificar algo aotros sin hacer suposiciones sobre quiénes son dichosobjetos. Esto es, cuando se quiere bajo acoplamiento.
Observer+ update()
Subject
forall o in observers:o.update();
ConcreteSubject- subjectState+ getState()+ setState()
ConcreteObserver- observerState+ update()
return subjectState;
observers
0..
subject0..
observerState = subject.getState();
:ConcreteSubject
co
:ConcreteObserver
co
:ConcreteObserver
setState()
notify()
update()getState()update()getState()
(sujeto con dos observadores)
:ConcreteSubject
co
:ConcreteObserver
setState()
notify()
update()getState() (sujeto con un número arbitrario de observadores)
loop
[for each co in observers]
Usualmente, el sujeto guarda una referencia a sus observadores z^
Costoso si hay muchos sujetos y pocos observadores. En ese caso: z^
z^
Extender la interfaz de actualización para que el observador sepa quésujeto cambió de estado (por ej. pasar el sujeto en la llamada a
update
).
s1:Sujetos2:Sujetos3:Sujetos4:Sujeto
o:Observador
z^
El sujeto desde aquellos métodos que cambian su estado z^
z^
z^
Las clases cliente z^
z^
z^
Se puede evitar notificando la eliminación del sujeto a sus observadores z^
En general, eliminar los observadores del sujeto eliminado no es unaopción
Soluciones: z^
z^
class ClaseSujetoBase {
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; } }
los clientes llaman a
operacionNotify
en vez de a
operacion
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
z^
Hacer
update
más eficiente, haciendo que los observadores se registren
sólo en los eventos que les interesan z^
Los observadores se subscriben a
aspectos
del sujeto
Observer+ update()
Subject
Fila
observers
1
1
Barras
Circular
*^
1
1
public abstract class Subject {
protected List
_observers =new LinkedList
_observers.add(o); } public void detach(Observer o) {
_observers.remove(o); } public void notify() {
Iterator
it.next().update();
} }
public class Datasource
extends Subject {private double _a, _b, _c, _d;public double[] getState () {
double[] d = new double[4];d[0] = _a;d[1] = _b;d[2] = _c;d[3] = _d;return d; } public void setState(double[] d){
_a = d[0];_b = d[1];_c = d[2];_d = d[3];this.notify(); } }
public abstract class Observer {
public abstract void update (); }
public class Fila extends Observer {
private Datasource _subject;private double[] _data;public Fila (Datasource s) {
_subject = s;_subject.attach(this);_data = new double[4]; } public void update () {
double[4] data;data = _subject.getState();for (int i=0; i<4; i++)
_data[i] = data[i]; this.redraw(); } public void redraw () { ... } }
z^
void update (Observable o, Object arg)
z^
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()