123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- """
- Reference: http://www.slideshare.net/ishraqabd/publish-subscribe-model-overview-13368808
- Author: https://github.com/HanWenfang
- """
- class Provider:
- def __init__(self):
- self.msg_queue = []
- self.subscribers = {}
- def notify(self, msg):
- self.msg_queue.append(msg)
- def subscribe(self, msg, subscriber):
- if msg not 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.msg_queue:
- if msg in self.subscribers:
- for sub in self.subscribers[msg]:
- sub.run(msg)
- self.msg_queue = []
- class Publisher:
- def __init__(self, msg_center):
- self.provider = msg_center
- def publish(self, msg):
- self.provider.notify(msg)
- class Subscriber:
- def __init__(self, name, msg_center):
- self.name = name
- self.provider = msg_center
- def subscribe(self, msg):
- self.provider.subscribe(msg, self)
- def run(self, msg):
- print("{} got {}".format(self.name, msg))
- def main():
- message_center = Provider()
- fftv = Publisher(message_center)
- jim = Subscriber("jim", message_center)
- jim.subscribe("cartoon")
- jack = Subscriber("jack", message_center)
- jack.subscribe("music")
- gee = Subscriber("gee", message_center)
- 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")
- message_center.update()
- if __name__ == "__main__":
- main()
- ### OUTPUT ###
- # jim got cartoon
- # jack got music
- # gee got movie
- # jim got cartoon
- # jim got cartoon
- # gee got movie
|