├── README.md ├── driver_observer1.py ├── driver_observer2.py ├── driver_observer3.py ├── observer1.py ├── observer2.py └── observer3.py /README.md: -------------------------------------------------------------------------------- 1 | Observer pattern in Python 2 | -------------------------------------------------------------------------------- /driver_observer1.py: -------------------------------------------------------------------------------- 1 | from observer1 import Publisher, Subscriber 2 | 3 | pub = Publisher() 4 | 5 | bob = Subscriber('Bob') 6 | alice = Subscriber('Alice') 7 | john = Subscriber('John') 8 | 9 | pub.register(bob) 10 | pub.register(alice) 11 | pub.register(john) 12 | 13 | pub.dispatch("It's lunchtime!") 14 | 15 | pub.unregister(john) 16 | 17 | pub.dispatch("Time for dinner") 18 | -------------------------------------------------------------------------------- /driver_observer2.py: -------------------------------------------------------------------------------- 1 | from observer2 import Publisher, SubscriberOne, SubscriberTwo 2 | 3 | pub = Publisher() 4 | bob = SubscriberOne('Bob') 5 | alice = SubscriberTwo('Alice') 6 | john = SubscriberOne('John') 7 | 8 | pub.register(bob, bob.update) 9 | pub.register(alice, alice.receive) 10 | pub.register(john) 11 | 12 | pub.dispatch("It's lunchtime!") 13 | pub.unregister(john) 14 | pub.dispatch("Time for dinner") 15 | -------------------------------------------------------------------------------- /driver_observer3.py: -------------------------------------------------------------------------------- 1 | from observer3 import Publisher, Subscriber 2 | 3 | pub = Publisher(['lunch', 'dinner']) 4 | bob = Subscriber('Bob') 5 | alice = Subscriber('Alice') 6 | john = Subscriber('John') 7 | 8 | pub.register("lunch", bob) 9 | pub.register("dinner", alice) 10 | pub.register("lunch", john) 11 | pub.register("dinner", john) 12 | 13 | pub.dispatch("lunch", "It's lunchtime!") 14 | pub.dispatch("dinner", "Dinner is served") 15 | -------------------------------------------------------------------------------- /observer1.py: -------------------------------------------------------------------------------- 1 | class Subscriber: 2 | def __init__(self, name): 3 | self.name = name 4 | def update(self, message): 5 | print('{} got message "{}"'.format(self.name, message)) 6 | 7 | class Publisher: 8 | def __init__(self): 9 | self.subscribers = set() 10 | def register(self, who): 11 | self.subscribers.add(who) 12 | def unregister(self, who): 13 | self.subscribers.discard(who) 14 | def dispatch(self, message): 15 | for subscriber in self.subscribers: 16 | subscriber.update(message) 17 | 18 | -------------------------------------------------------------------------------- /observer2.py: -------------------------------------------------------------------------------- 1 | class SubscriberOne: 2 | def __init__(self, name): 3 | self.name = name 4 | def update(self, message): 5 | print('{} got message "{}"'.format(self.name, message)) 6 | class SubscriberTwo: 7 | def __init__(self, name): 8 | self.name = name 9 | def receive(self, message): 10 | print('{} got message "{}"'.format(self.name, message)) 11 | 12 | class Publisher: 13 | def __init__(self): 14 | self.subscribers = dict() 15 | def register(self, who, callback=None): 16 | if callback == None: 17 | callback = getattr(who, 'update') 18 | self.subscribers[who] = callback 19 | def unregister(self, who): 20 | del self.subscribers[who] 21 | def dispatch(self, message): 22 | for subscriber, callback in self.subscribers.items(): 23 | callback(message) 24 | 25 | -------------------------------------------------------------------------------- /observer3.py: -------------------------------------------------------------------------------- 1 | class Subscriber: 2 | def __init__(self, name): 3 | self.name = name 4 | def update(self, message): 5 | print('{} got message "{}"'.format(self.name, message)) 6 | 7 | class Publisher: 8 | def __init__(self, events): 9 | # maps event names to subscribers 10 | # str -> dict 11 | self.events = { event : dict() 12 | for event in events } 13 | def get_subscribers(self, event): 14 | return self.events[event] 15 | def register(self, event, who, callback=None): 16 | if callback == None: 17 | callback = getattr(who, 'update') 18 | self.get_subscribers(event)[who] = callback 19 | def unregister(self, event, who): 20 | del self.get_subscribers(event)[who] 21 | def dispatch(self, event, message): 22 | for subscriber, callback in self.get_subscribers(event).items(): 23 | callback(message) 24 | 25 | --------------------------------------------------------------------------------