1. 程式人生 > >【編程思想】【設計模式】【行為模式Behavioral】Publish_Subscribe

【編程思想】【設計模式】【行為模式Behavioral】Publish_Subscribe

行為模式 des mode master 設計 ide publish open odin

Python版

https://github.com/faif/python-patterns/blob/master/behavioral/publish_subscribe.py

技術分享圖片
#!/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): self.subscribers.setdefault(msg, []).append(subscriber) def unsubscribe(self, msg, subscriber): self.subscribers[msg].remove(subscriber)
def update(self): for msg in self.msg_queue: for sub in self.subscribers.get(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 unsubscribe(self, msg): self.provider.unsubscribe(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") vani = Subscriber("vani", message_center) vani.subscribe("movie") vani.unsubscribe("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
Python轉載版

【編程思想】【設計模式】【行為模式Behavioral】Publish_Subscribe