Skip to content

Commit ee37556

Browse files
author
Sakis Kasampalis
committed
Merge pull request faif#34 from HanWenfang/master
publish_subscribe pattern
2 parents 1db5bff + 648efac commit ee37556

File tree

2 files changed

+79
-1
lines changed

2 files changed

+79
-1
lines changed

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,5 @@ Current Patterns:
3131
* template
3232
* command
3333
* memento
34-
* visitor
34+
* visitor
35+
* publish_subscribe

publish_subscribe.py

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#!/usr/bin/env python
2+
3+
'''
4+
Reference: http://www.slideshare.net/ishraqabd/publish-subscribe-model-overview-13368808
5+
Author: https://github.com/HanWenfang
6+
'''
7+
8+
class Provider:
9+
def __init__(self):
10+
self.msgQueue = []
11+
self.subscribers = {}
12+
13+
def notify(self, msg):
14+
self.msgQueue.append(msg)
15+
16+
def subscribe(self,msg, subscriber):
17+
if not msg in self.subscribers:
18+
self.subscribers[msg] = []
19+
self.subscribers[msg].append(subscriber) #unfair
20+
else:
21+
self.subscribers[msg].append(subscriber)
22+
23+
def unSubscribe(self,msg, subscriber):
24+
self.subscribers[msg].remove(subscriber)
25+
26+
def update(self):
27+
for msg in self.msgQueue:
28+
if msg in self.subscribers:
29+
for sub in self.subscribers[msg]:
30+
sub.run(msg)
31+
self.msgQueue = []
32+
33+
class Publisher:
34+
def __init__(self, msgCenter):
35+
self.provider = msgCenter
36+
37+
def publish(self, msg):
38+
self.provider.notify(msg)
39+
40+
41+
class Subscriber:
42+
def __init__(self,name,msgCenter):
43+
self.name = name
44+
self.provider = msgCenter
45+
46+
def subscribe(self, msg):
47+
self.provider.subscribe(msg, self)
48+
49+
def run(self, msg):
50+
print "%s got %s"%(self.name, msg)
51+
52+
53+
def main():
54+
messageCenter = Provider()
55+
56+
fftv = Publisher(messageCenter)
57+
58+
jim = Subscriber("jim", messageCenter)
59+
jim.subscribe("cartoon")
60+
jack = Subscriber("jack", messageCenter)
61+
jack.subscribe("music")
62+
gee = Subscriber("gee", messageCenter)
63+
gee.subscribe("movie")
64+
65+
fftv.publish("cartoon")
66+
fftv.publish("music")
67+
fftv.publish("ads")
68+
fftv.publish("movie")
69+
fftv.publish("cartoon")
70+
fftv.publish("cartoon")
71+
fftv.publish("movie")
72+
fftv.publish("blank")
73+
74+
messageCenter.update()
75+
76+
if __name__ == "__main__":
77+
main()

0 commit comments

Comments
 (0)