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+
classProvider:
6+
def__init__(self):
7+
self.msgQueue= []
8+
self.subscribers={}
9+
10+
defnotify(self, msg):
11+
self.msgQueue.append(msg)
12+
13+
defsubscribe(self,msg, subscriber):
14+
ifnotmsginself.subscribers:
15+
self.subscribers[msg] = []
16+
self.subscribers[msg].append(subscriber) #unfair
17+
else:
18+
self.subscribers[msg].append(subscriber)
19+
20+
defunSubscribe(self,msg, subscriber):
21+
self.subscribers[msg].remove(subscriber)
22+
23+
defupdate(self):
24+
formsginself.msgQueue:
25+
ifmsginself.subscribers:
26+
forsubinself.subscribers[msg]:
27+
sub.run(msg)
28+
self.msgQueue= []
29+
30+
classPublisher:
31+
def__init__(self, msgCenter):
32+
self.provider=msgCenter
33+
34+
defpublish(self, msg):
35+
self.provider.notify(msg)
36+
37+
38+
classSubscriber:
39+
def__init__(self,name,msgCenter):
40+
self.name=name
41+
self.provider=msgCenter
42+
43+
defsubscribe(self, msg):
44+
self.provider.subscribe(msg, self)
45+
46+
defrun(self, msg):
47+
print"%s got %s"%(self.name, msg)
48+
49+
50+
defmain():
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)