123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- #!/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()
|