观察者模式
模式定义:定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
模式结构:
- Subject: 目标,抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象
- ConcreteSubject: 具体目标,该角色将有关状态存入具体观察者对象,在自己内部状态发生改变时,给所有注册过的观察者发送通知
- Observer: 观察者,观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己
- ConcreteObserver: 具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态
实例:
from abc import abstractmethod,ABCMeta class Watcher(metaclass=ABCMeta): """观察者""" @abstractmethod def update(self,information): """ :return: """ class SubjectInterface(metaclass=ABCMeta): """目标""" @abstractmethod def add_watcher(self,watcherObj): """ :param watcherObj: :return: """ def remove_watcher(self,watcherObj): """ :param watcherObj: :return: """ def notify_watcher(self,information): """ :param information: :return: """ class ConcreteWatcher(Watcher): """具体观察者""" def update(self,information): print(information) class ConcreteSubject(SubjectInterface): """具体目标""" def __init__(self): self._watcher = [] def add_watcher(self,watcherObj): self._watcher.append(watcherObj) def remove_watcher(self,watcherObj): if watcherObj in self._watcher: self._watcher.remove(watcherObj) def notify_watcher(self,information): for i in self._watcher: i.update(information) if __name__ == "__main__": fairy = ConcreteSubject() boy1 = ConcreteWatcher() boy2 = ConcreteWatcher() boy3 = ConcreteWatcher() fairy.add_watcher(boy1) fairy.add_watcher(boy2) fairy.add_watcher(boy3) fairy.notify_watcher("shy")