当一个对象改变时,则通知依赖它的对象。

优点:
观察者与被观察者是抽象耦合的
缺点:
太多观察者会导致,通知所有的观察者花费很多时间。

Demo

  1. """
  2. 观察者模式
  3. """
  4. from abc import ABCMeta, abstractmethod
  5. class Subject:
  6. def __init__(self):
  7. self.observers = []
  8. self.state = None
  9. def set_state(self, state):
  10. self.state = state
  11. self.notify_observers()
  12. def notify_observers(self):
  13. for observer in self.observers:
  14. observer.update()
  15. def add_observer(self, observer):
  16. self.observers.append(observer)
  17. class Observer(metaclass=ABCMeta):
  18. @abstractmethod
  19. def update(self):
  20. pass
  21. class AObserver(Observer):
  22. def update(self):
  23. print(f"[{self.__class__}] update")
  24. class BObserver(Observer):
  25. def update(self):
  26. print(f"[{self.__class__}] update")
  27. class CObserver(Observer):
  28. def update(self):
  29. print(f"[{self.__class__}] update")
  30. if __name__ == '__main__':
  31. s = Subject()
  32. s.add_observer(AObserver())
  33. s.add_observer(BObserver())
  34. s.add_observer(CObserver())
  35. s.set_state("ccc")
  36. s.set_state("bbbb")