Nesse padrão, os objetos são representados como observadores que aguardam o disparo de um evento. Um observador se conecta ao assunto assim que o evento especificado ocorre. Conforme o evento ocorre, o sujeito diz aos observadores que ele ocorreu.
O diagrama UML a seguir representa o padrão do observador -
Como implementar o padrão do observador?
Vamos agora ver como implementar o padrão do observador.
import threading
import time
import pdb
class Downloader(threading.Thread):
def run(self):
print 'downloading'
for i in range(1,5):
self.i = i
time.sleep(2)
print 'unfunf'
return 'hello world'
class Worker(threading.Thread):
def run(self):
for i in range(1,5):
print 'worker running: %i (%i)' % (i, t.i)
time.sleep(1)
t.join()
print 'done'
t = Downloader()
t.start()
time.sleep(1)
t1 = Worker()
t1.start()
t2 = Worker()
t2.start()
t3 = Worker()
t3.start()
Resultado
O programa acima gera a seguinte saída -
Explicação
O código acima explica o procedimento de download de um determinado resultado. De acordo com a lógica do padrão do observador, todo objeto é tratado como observador. Ele imprime a saída quando o evento é disparado.