- 内容:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式又称 “发布—-订阅”模式
- 角色:
- 抽象主题(Subject)
- 具体主题(ConcreteSubject) —- 发布者
- 抽象观察者 (Observer)
- 具体观察者(ConcreteObserver) —-订阅者

from abc import ABCMeta, abstractmethodclass Observer(metaclass=ABCMeta): @abstractmethod def update(self, notice): passclass Notice: def __init__(self): self.observers = [] def attach(self, obs): self.observers.append(obs) def detach(self, obs): self.observers.remove(obs) def notify(self): for obj in self.observers: obj.update(self)class ManagerNotice(Notice): def __init__(self, company_info=None): super().__init__() self.__company_info = company_info @property def company_info(self): return self.__company_info @company_info.setter def company_info(self, info): self.__company_info = info self.notify()class Manager(Observer): def __init__(self): self.company_info = None def update(self, noti): self.company_info = noti.company_infonotice = ManagerNotice()alex = Manager()wusir = Manager()#print(alex.company_info)#print(wusir.company_info)notice.attach(alex)notice.attach(wusir)#notice.company_info="公司运行良好"##print(alex.company_info)#print(wusir.company_info)notice.company_info="公司将要上市"#print(alex.company_info)#print(wusir.company_info)#notice.detach(wusir)#notice.company_info="公司要破产了,赶快跑路"print(alex.company_info)print(wusir.company_info)
- 适用场景:
- 当一个抽象模型有两方面,其中一个方面依赖于另一个方面。将这两者封装在独立对象中以使它们可以各自独立改变和复用。
- 当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
- 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象是紧密耦合的。
- 优点:
- 缺点:
- 多个观察者之间互不知道对方存在,因此一个观察者对主题的修改可能造成错误的更新。