浏览代码

Merge pull request #34 from HanWenfang/master

publish_subscribe pattern
Sakis Kasampalis 11 年之前
父节点
当前提交
ee37556a3c
共有 2 个文件被更改,包括 79 次插入1 次删除
  1. 2 1
      README.md
  2. 77 0
      publish_subscribe.py

+ 2 - 1
README.md

@@ -31,4 +31,5 @@ Current Patterns:
 * template
 * command		
 * memento		
-* visitor
+* visitor
+* publish_subscribe

+ 77 - 0
publish_subscribe.py

@@ -0,0 +1,77 @@
+#!/usr/bin/env python
+
+'''
+Reference: http://www.slideshare.net/ishraqabd/publish-subscribe-model-overview-13368808
+Author: https://github.com/HanWenfang
+'''
+
+class Provider:
+	def __init__(self):
+		self.msgQueue = []
+		self.subscribers = {}
+
+	def notify(self, msg):
+		self.msgQueue.append(msg)
+
+	def subscribe(self,msg, subscriber):
+		if not msg in self.subscribers:
+			self.subscribers[msg] = []
+			self.subscribers[msg].append(subscriber) #unfair
+		else:
+			self.subscribers[msg].append(subscriber)
+	
+	def unSubscribe(self,msg, subscriber):
+		self.subscribers[msg].remove(subscriber)
+
+	def update(self):
+		for msg in self.msgQueue:
+			if msg in self.subscribers:
+				for sub in self.subscribers[msg]:
+					sub.run(msg)
+		self.msgQueue = []
+
+class Publisher:
+	def __init__(self, msgCenter):
+		self.provider = msgCenter
+	
+	def publish(self, msg):
+		self.provider.notify(msg)
+
+
+class Subscriber:
+	def __init__(self,name,msgCenter):
+		self.name = name
+		self.provider = msgCenter
+
+	def subscribe(self, msg):
+		self.provider.subscribe(msg, self)
+
+	def run(self, msg):
+		print "%s got %s"%(self.name, msg)
+
+
+def main():
+	messageCenter = Provider()
+
+	fftv = Publisher(messageCenter)
+
+	jim = Subscriber("jim", messageCenter)
+	jim.subscribe("cartoon")
+	jack = Subscriber("jack", messageCenter)
+	jack.subscribe("music")
+	gee = Subscriber("gee", messageCenter)
+	gee.subscribe("movie")
+
+	fftv.publish("cartoon")
+	fftv.publish("music")
+	fftv.publish("ads")
+	fftv.publish("movie")
+	fftv.publish("cartoon")
+	fftv.publish("cartoon")
+	fftv.publish("movie")
+	fftv.publish("blank")
+
+	messageCenter.update()
+
+if __name__ == "__main__":
+	main()