From 836ddd08f5de0c68b908426e3e308a6ad568db68 Mon Sep 17 00:00:00 2001 From: susan Date: Fri, 20 Dec 2013 13:31:36 +0800 Subject: [PATCH 1/2] publish_subscribe pattern --- README.md | 3 +- publish_subscribe.py | 74 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 publish_subscribe.py diff --git a/README.md b/README.md index 8fbcd799..318adc5f 100644 --- a/README.md +++ b/README.md @@ -31,4 +31,5 @@ Current Patterns: * template * command * memento -* visitor \ No newline at end of file +* visitor +* publish_subscribe \ No newline at end of file diff --git a/publish_subscribe.py b/publish_subscribe.py new file mode 100644 index 00000000..02566627 --- /dev/null +++ b/publish_subscribe.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python + +'''http://www.slideshare.net/ishraqabd/publish-subscribe-model-overview-13368808''' + +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() From 648efacd7d99b83eb60ec5edbc24ac644ff02c68 Mon Sep 17 00:00:00 2001 From: susan Date: Fri, 20 Dec 2013 14:25:55 +0800 Subject: [PATCH 2/2] author --- publish_subscribe.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/publish_subscribe.py b/publish_subscribe.py index 02566627..1219ff22 100644 --- a/publish_subscribe.py +++ b/publish_subscribe.py @@ -1,6 +1,9 @@ #!/usr/bin/env python -'''http://www.slideshare.net/ishraqabd/publish-subscribe-model-overview-13368808''' +''' +Reference: http://www.slideshare.net/ishraqabd/publish-subscribe-model-overview-13368808 +Author: https://github.com/HanWenfang +''' class Provider: def __init__(self):