一、内容
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新。
观察者模式又称‘发布-订阅’模式
二、角色
- 抽象主题(Subject)
- 具体主题(ConcreteSubject)——发布者
- 抽象观察者(Observer)
- 具体观察者(ConcreteObserver)——订阅者
三、优点
- 目标和观察者之间的抽象耦合最小
- 支持广播通信
四、缺点
- 多个观察者之间互不知道对方存在,因此一个观察者对主题的修改可能造成错误的更新。
五、适用场景
- 当一个抽象模型有两方面,其中一方面依赖于另一方面。将这两者封装在独立对象中以使它们可以独立地改变和复用。
- 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
- 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。换言之,你不希望这些对象是紧密耦合的
六、代码示例
from abc import ABCMeta, abstractmethod class Observer(metaclass=ABCMeta): @abstractmethod def update(self, notice): pass class Notice: def __init__(self): self.observers = [] # 记录该主体的观察者(订阅者) def attach(self, obs): self.observers.append(obs) def detach(self, obs): obs.company_info = None 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_info notice = 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.detach(wusir) # notice.company_info="公司要破产了" print(alex.company_info) print(wusir.company_info)