观察者模式:又叫发布订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时,会通知所有观察者对象,是他们能自动更新自己。
事件驱动系统是观察者模式的例子,在这种系统中,监听者被用于监听特定事件。监听者正在监听的事件被创建出来时,就会触发它们。这个事件可以是键入(键盘的)某个特定键、移动鼠标或者其他。事件扮演发布者的角色,监听者则扮演观察者的角色。在这里,关键点是单个事件(发布者)可以关联多个监听者 (观察者) 。
class Monitor:
"""通知者--->班长-->管理观察者"""
def __init__(self):
self.observers = [] # 保存观察者对象
self.status="" # 表示状态
def attach(self,observer):
"""绑定每一个观察者"""
self.observers.append(observer)
def notify(self):
"""通知每一个观察者"""
for observser in self.observers:
observser.update()
class SleepStudentobserver:
"""观察者"""
def __init__(self,name,monitor):
self.name=name # 被观察者姓名
self.monitor=monitor # 绑带通知者
def update(self):
print("{},{}赶紧起来学习".format(self.monitor.status,self.name))
if __name__=="__main__":
monitor=Monitor()
observer1=SleepStudentobserver("迪迦",monitor)
observer2 = SleepStudentobserver("泰罗", monitor)
monitor.attach(observer1)
monitor.attach(observer2)
monitor.status = '老师又来了'
monitor.notify()
观察者模式的优点和应用场景
优点:
1、观察者与被观察者之间是抽象耦合的;
2、可以将许多符合单一职责原则的模块进行触发,也可以很方便地实现广播。
应用场景:
1、消息交换场景。如上述说到的上课睡觉观察者通知老师来了等;
2、多级触发场景。比如支持中断模式的场景中,一个中断即会引发一连串反应,就可以使用观察者模式。
观察者模式的缺点
1、观察者模式可能会带来整体系统效率的浪费;
2、如果被观察者之间有依赖关系,其逻辑关系的梳理需要费些心思。