Skip to content

Commit c5fff6e

Browse files
committed
observer pattern
1 parent e959b28 commit c5fff6e

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

observer/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Observer pattern
2+
3+
Code example adapted from page 334 in chapter 14, *Useful Design Patterns* of the book [Expert Python Programming](https://www.packtpub.com/application-development/expert-python-programming) (Packt, 2008) by **Tarek Ziadé**.
4+

observer/observer.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
"""
2+
>>> WriteEvent.register(log)
3+
>>> WriteEvent.notify('file #1')
4+
file #1 was written
5+
>>> WriteEvent.register(AnotherObserver())
6+
>>> WriteEvent.notify('file #2')
7+
file #2 was written
8+
Yeah WriteEvent told me!
9+
10+
"""
11+
12+
13+
class Event(object):
14+
_observers = []
15+
16+
def __init__(self, subject):
17+
self.subject = subject
18+
19+
@classmethod
20+
def register(cls, observer):
21+
if observer not in cls._observers:
22+
cls._observers.append(observer)
23+
24+
@classmethod
25+
def unregister(cls, observer):
26+
if observer in cls._observers:
27+
self._observers.remove(observer)
28+
29+
@classmethod
30+
def notify(cls, subject):
31+
event = cls(subject)
32+
for observer in cls._observers:
33+
observer(event)
34+
35+
class WriteEvent(Event):
36+
37+
def __repr__(self):
38+
return 'WriteEvent'
39+
40+
def log(event):
41+
print('%s was written' % event.subject)
42+
43+
44+
class AnotherObserver(object):
45+
def __call__(self, event):
46+
print('Yeah %s told me!' % event)
47+
48+
if __name__ == '__main__':
49+
import doctest
50+
failed, attempted = doctest.testmod()
51+
if not failed:
52+
print('OK: %s tests passed' % attempted)
53+
else:
54+
print('FAIL: %s test(s) failed (of %s total)'
55+
% (failed, attempted))

0 commit comments

Comments
 (0)