- Observer (patrón de diseño)
-
El patrón Observador (en inglés: Observer) también conocido como "spider" define una dependencia del tipo uno-a-muchos entre objetos, de manera que cuando uno de los objetos cambia su estado, el observador se encarga de notificar este cambio a todos los otros dependientes.
El objetivo de este patrón es desacoplar la clase de los objetos clientes del objeto, aumentando la modularidad del lenguaje, así como evitar bucles de actualización (espera activa o polling).
Este patrón también se conoce como el patrón de publicación-inscripción o modelo-patrón. Estos nombres sugieren las ideas básicas del patrón, que son bien sencillas: el objeto de datos, llamémoslo "Sujeto" a partir de ahora, contiene atributos mediante los cuales cualquier objeto observador o vista se puede suscribir a él pasándole una referencia a sí mismo. El Sujeto mantiene así una lista de las referencias a sus observadores.
Los observadores a su vez están obligados a implementar unos métodos determinados mediante los cuales el Sujeto es capaz de notificar a sus observadores "suscritos" los cambios que sufre para que todos ellos tengan la oportunidad de refrescar el contenido representado. De manera que cuando se produce un cambio en el Sujeto, ejecutado, por ejemplo, por alguno de los observadores, el objeto de datos puede recorrer la lista de observadores avisando a cada uno.
Este patrón suele observarse en los frameworks de interfaces gráficas orientados a objetos, en los que la forma de capturar los eventos es suscribir 'listeners' a los objetos que pueden disparar eventos.En Java se puede heredar la funcionalidad del patrón Observer de la clase Observable y los observadores pueden implementar la interfaz Observer y por lo tanto redefinir el método update().
Ejemplo
- Wikilibros alberga un libro o manual sobre Patrones de Comportamiento.
Un ejemplo sería un programa que leyese del teclado y cada línea se trataría como un evento. Cuando una línea fuere obtenida, se llamaría al método que notificaría a los observadores, tal que todos los observadores fueren avisados de la ocurrencia del evento mediante sus métodos de actualización (update).A continuación otro ejemplo, escrito en lenguaje Python, muestra este patrón.
class Listener: def __init__(self, name, subject): self.name = name subject.register(self) def notify(self, event): print self.name, "received event", event
class Subject: def __init__(self): self.listeners = [] def register(self, listener): self.listeners.append(listener) def unregister(self, listener): self.listeners.remove(listener) def notify_listeners(self, event): for listener in self.listeners: listener.notify(event)
subject = Subject() listenerA = Listener("<listener A>", subject) listenerB = Listener("<listener B>", subject) # El objeto Subject ahora tiene dos "escuchadores" registrados subject.notify_listeners ("<event 1>") # La salida obtenida es : # <listener A> received event <event 1> # <listener B> received event <event 1>
Enlaces externos
Categoría:- Patrones de diseño
Wikimedia foundation. 2010.