观察者模式
-
定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并被自动更新,观察者模式又称'发布订阅'模式。
-
角色:抽象主题,具体主题(发布者),抽象观察者,具体观察者(订阅者)
-
适用场景:
- 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将两者封装在独立的对象中,以使它们各自独立的改变和复用。
- 当一个对象的改变需要同时改变其他对象,而且不知道有多少对象以待改变
- 当一个对象必须通知其他对象,而且又不知道其他对象是谁,即这些对象之间时解耦的
-
优点:目标和观察者之间的耦合最小,支持广播通信
-
缺点:
- 多个观察者之间不知道对方的存在,因此一个观察者对主题的修改肯能造成错误的更新
- 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。
-
逻辑:订阅者通过抽象观察者来操作修改发布者,当对象的属性进行修改的时候,便会通过发布者列表经行通知所有订阅者并进行修改
class Oberserver(object):
'''抽象主题'''
def update(self):
raise NotImplemented('请使用同名的update方法')
class Notice(object):
'''具体出题(发布者)'''
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() #修改完后调用发布者里面的notify方法通知其他订阅者并修改
class Manager(Oberserver):
'''具体观察者(订阅者)'''
def __init__(self):
self.company_info=None
def update(self,noti):
self.company_info=noti.company_info
#实例化抽象观察者
notice=ManagerNotice()
# 实例化具体观察者,创建两个订阅者
alex=Manager()
tony=Manager()
# 将订阅者添加到订阅者列表
notice.attach(alex)
notice.attach(tony)
# 发布信息公司运行良好
notice.company_info='公司运行良好'
print(alex.company_info)
print(tony.company_info)
notice.company_info='公司将要上市'
print(alex.company_info)
print(tony.company_info)
notice.detach(tony)
notice.company_info='公司要破产了,赶快跑路'
print(alex.company_info)
print(tony.company_info)
# 公司运行良好
# 公司运行良好
# 公司将要上市
# 公司将要上市
# 公司要破产了,赶快跑路
# 公司将要上市