Skip to content

Commit b270c63

Browse files
committed
add Observer pattern
1 parent 9683e83 commit b270c63

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed

observer/Observer.py

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
#
2+
# Python Design Patterns: Observer
3+
# Author: Jakub Vojvoda [github.com/JakubVojvoda]
4+
# 2016
5+
#
6+
# Source code is licensed under MIT License
7+
# (for more details see LICENSE)
8+
#
9+
10+
import sys
11+
12+
#
13+
# Observer
14+
# defines an updating interface for objects that should be notified
15+
# of changes in a subject
16+
#
17+
class Observer:
18+
def getState(self):
19+
pass
20+
21+
def update(self, subject):
22+
pass
23+
24+
#
25+
# Concrete Observer
26+
# stores state of interest to ConcreteObserver objects and
27+
# sends a notification to its observers when its state changes
28+
#
29+
class ConcreteObserver(Observer):
30+
def __init__(self, state):
31+
Observer.__init__(self)
32+
self._state = state
33+
34+
def getState(self):
35+
return self._state
36+
37+
def update(self, subject):
38+
self._state = subject.getState()
39+
print("Observer state updated.")
40+
41+
#
42+
# Subject
43+
# knows its observers and provides an interface for attaching
44+
# and detaching observers
45+
#
46+
class Subject:
47+
def __init__(self):
48+
self._observers = []
49+
50+
def attach(self, observer):
51+
self._observers.append(observer)
52+
53+
def detach(self, index):
54+
self._observers.remove(index)
55+
56+
def notify(self):
57+
for observer in self._observers:
58+
observer.update(self)
59+
60+
def getState(self):
61+
pass
62+
63+
def setState(self, state):
64+
pass
65+
66+
#
67+
# Concrete Subject
68+
# stores state that should stay consistent with the subject's
69+
#
70+
class ConcreteSubject(Subject):
71+
def __init__(self):
72+
Subject.__init__(self)
73+
self._state = 0
74+
75+
def getState(self):
76+
return self._state
77+
78+
def setState(self, state):
79+
self._state = state
80+
81+
82+
if __name__ == "__main__":
83+
observer1 = ConcreteObserver(1)
84+
observer2 = ConcreteObserver(2)
85+
86+
print("Observer 1 state: " + str(observer1.getState()))
87+
print("Observer 2 state: " + str(observer2.getState()))
88+
89+
subject = ConcreteSubject()
90+
subject.attach(observer1)
91+
subject.attach(observer2)
92+
93+
subject.setState(10)
94+
subject.notify()
95+
96+
print("Observer 1 state: " + str(observer1.getState()))
97+
print("Observer 2 state: " + str(observer2.getState()))

0 commit comments

Comments
 (0)