观察者模式中主要两个核心角色:主题和观察者,兼顾面向对象的一些原则,还可以抽象出抽象主题和抽象观察者角色。这里使用 python 对观察者模式进行一个简单的实现,python 是 ‘鸭子类型’ 的语言,天生就兼容各种接口,只要类中提供了相应的方法就行,所以特意弄个抽象类搞得有点画蛇添足了,但有时候为了让开发人员少犯错误,为开发提供统一规范,提供一些抽象类作为基类使用也是合理的。
from abc import ABCMeta, abstractmethod
class Subject:
def __init__(self):
self._observers = set()
def register(self, observer):
if not issubclass(observer.__class__, Observer):
raise Exception('something wrong with your Observer')
self._observers.add(observer)
def unregister(self, observer):
self._observers.remove(observer)
def notify(self, data):
for o in self._observers:
o.handler(data)
class Observer(metaclass=ABCMeta):
@abstractmethod
def handler(self, data):
pass
class ObserverA(Observer):
def handler(self, data):
print('observerA handler {}'.format(data))
class ObserverB(Observer):
def handler(self, data):
print('observerB handler {}'.format(data))
class ObserverC(Observer):
def handler(self, data):
print('observerC handler {}'.format(data))
if __name__ == '__main__':
s = Subject()
s.register(ObserverA())
s.register(ObserverB())
s.register(ObserverC())
s.notify('hello')
输出
observerC handler hello
observerA handler hello
observerB handler hello