forked from pkolt/design_patterns
-
Notifications
You must be signed in to change notification settings - Fork 1
/
observer.py
61 lines (45 loc) · 1.92 KB
/
observer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# coding: utf-8
"""
Наблюдатель (Observer, Dependents, Publish-Subscribe) - паттерн поведения объектов.
Определяет зависимость типа "один ко многим" между объектами таким образом,
что при изменении состояния одного объекта все зависящие от него оповещаются об этом
и автоматически обновляются.
"""
class Subject(object):
"""Субъект"""
def __init__(self):
self._data = None
self._observers = set()
def attach(self, observer):
# подписаться на оповещение
if not isinstance(observer, ObserverBase):
raise TypeError()
self._observers.add(observer)
def detach(self, observer):
# отписаться от оповещения
self._observers.remove(observer)
def get_data(self):
return self._data
def set_data(self, data):
self._data = data
self.notify(data)
def notify(self, data):
# уведомить всех наблюдателей о событии
for observer in self._observers:
observer.update(data)
class ObserverBase(object):
"""Абстрактный наблюдатель"""
def update(self, data):
raise NotImplementedError()
class Observer(ObserverBase):
"""Наблюдатель"""
def __init__(self, name):
self._name = name
def update(self, data):
print '%s: %s' % (self._name, data)
subject = Subject()
subject.attach(Observer('Наблюдатель 1'))
subject.attach(Observer('Наблюдатель 2'))
subject.set_data('данные для наблюдателя')
# Наблюдатель 2: данные для наблюдателя
# Наблюдатель 1: данные для наблюдателя