Skip to content

Commit 836ddd0

Browse files
committed
publish_subscribe pattern
1 parent 1db5bff commit 836ddd0

File tree

2 files changed

+76
-1
lines changed

2 files changed

+76
-1
lines changed

README.md

Lines changed: 2 additions & 1 deletion
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

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

0 commit comments

Comments
 (0)