Source code for libutilitaspy.patterns.observer
"""
This module implements the base classes of the *observer pattern* [GoF94]_.
.. [GoF94] E. Gamma, R. Helm, R. Johnson and J. Vlissides. Design Patterns: Elements of reusable Object-Oriented Software. 1994
"""
[docs]class Observer:
"""
An *observer* (also called *listener*) is any object which can be registered
with some :py:class:`Observable` object to be notified whenever the
Observable object is updated.
"""
[docs] def notify(self, *args, **kwargs):
"""Method executed whenever any Observable where self is registered is updated.
It should be overriden by a subclass."""
pass
[docs]class Observable:
"""
An *observable* object is any object that has a list of registered
:py:class:`Observer` objects which are notified whenever the observable object is
updated (a relevant change of state occurs).
"""
def __init__(self):
self.observers = []
[docs] def register(self, observer):
"""
Registers the observer object.
:param Observer observer: The object to register.
:post: after(self.observers) == before(self.observers) + [observer]
"""
self.observers.append(observer)
[docs] def deregister(self, observer):
"""
Unregisters the observer object.
:param Observer observer: The object to register.
:pre: observer in self.observers
:post: after(self.observers) == before(self.observers) - [observer]
"""
self.observers.remove(observer)
[docs] def update(self, *args, **kwargs):
"""
Notifies all registered observers.
"""
for observer in self.observers:
observer.notify(*args, **kwargs)