观察模式
-
内容
定义对象中的一对多的依赖关系,当一个对象的状态发生改变。所有依赖于他的对象都得到通知并被自动更新,又被称为“发布-订阅”关系
-
角色
- 抽象主题
- 具体主题
- 抽象观察者
- 具体观察者
-
使用场景
- 当一个抽象模型两方面,其中一个方面依赖另一个方面,将这两个封装在一个独立的对象中,可以使他们各自改变和复用
- 当一个对象的改变需要改变其他对象的时候,而不知道具体有多少对象带改变
- 当一个对象必须通知其他对象,而他又不能假定其他对象是谁(不希望这些对象是紧密耦合的)
-
优点
- 目标和观察者之间耦合最小
- 支持广播通信
-
代码实例
from abc import ABCMeta,abstractmethod # 观察者(订阅者) class ObServer(metaclass=ABCMeta): @abstractmethod def update(self,notice): pass # 发布者 class Notice(object): """dcstring for notice""" def __init__(self, *arg,**kwargs): self.ObServers = [] # 列表里面的对象应该是ObServer类 def attah(self,ObServer): self.ObServers.append(ObServer) def pepth(self,ObServer): self.ObServers.remove(ObServer) def notify(self): for obs in self.ObServers: obs.update() # 发布者实例 class StaffNotice(Notice): """docstring for StaffNotie""" def __init__(self,company_info,*args,**kwargs): super().__init__(args,kwargs) self.__company_info = company_info @property def show_company_info(self): return self.__company_info @show_company_info.setter def show_company_info(self,company_info): self.__company_info = company_info self.notify() # 观察者实例 class Staff(ObServer): """docstring for Staff""" def __init__(self): self.company_info = None def update(self,notice): self.company_info = notice.show_company_info return self.company_info staff = StaffNotice('正在初始化公司') staff.show_company_info = '阿里巴巴' s1 = Staff() s2 = Staff() staff.attah(s1) staff.attah(s2) print(s1.update(staff)) print(s2.update(staff))