当一个对象改变时,则通知依赖它的对象。
优点:
观察者与被观察者是抽象耦合的
缺点:
太多观察者会导致,通知所有的观察者花费很多时间。
Demo
"""
观察者模式
"""
from abc import ABCMeta, abstractmethod
class Subject:
def __init__(self):
self.observers = []
self.state = None
def set_state(self, state):
self.state = state
self.notify_observers()
def notify_observers(self):
for observer in self.observers:
observer.update()
def add_observer(self, observer):
self.observers.append(observer)
class Observer(metaclass=ABCMeta):
@abstractmethod
def update(self):
pass
class AObserver(Observer):
def update(self):
print(f"[{self.__class__}] update")
class BObserver(Observer):
def update(self):
print(f"[{self.__class__}] update")
class CObserver(Observer):
def update(self):
print(f"[{self.__class__}] update")
if __name__ == '__main__':
s = Subject()
s.add_observer(AObserver())
s.add_observer(BObserver())
s.add_observer(CObserver())
s.set_state("ccc")
s.set_state("bbbb")