观察者模式:
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己
代码实现:
班长、学习委员发现老师进教室时,负责通知睡觉、玩游戏的学生起来做好。
from abc import abstractmethod
class Informer(object):
def __init__(self):
self.observers = [] # 保存所有观察者对象
self.status = '' # 班长状态
def attach(self, student):
self.observers.append(student)
def notify(self):
for p in self.observers:
p.update()
# 通知者(班长)
class Monitor(Informer):
pass
# 通知者(学委)
class Studyer(Informer):
pass
class Students(object):
def __init__(self, name, monitor):
self.name = name
self.monitor = monitor # 绑定通知者
@abstractmethod
def update(self):
pass
# 观察者(睡觉的同学)
class StudentSleep(Students):
def update(self):
print('{},{}快醒醒,别睡了!'.format(self.monitor.status, self.name))
# 观察者(玩游戏的同学)
class StudentGame(Students):
def update(self):
print('{},{}快别玩游戏了!'.format(self.monitor.status, self.name))
if __name__ == '__main__':
monitor = Monitor()
monitor.status = '老师来了!'
s1 = StudentSleep('李小龙', monitor)
s2 = StudentSleep('成龙', monitor)
monitor.attach(s1)
monitor.attach(s2)
monitor.notify()
stu = Studyer()
stu.status = '老师来了!'
s3 = StudentGame('小赵', stu)
s4 = StudentGame('小兰', stu)
stu.attach(s3)
stu.attach(s4)
stu.notify()
'''
老师来了!,李小龙快醒醒,别睡了!
老师来了!,成龙快醒醒,别睡了!
老师来了!,小赵快别玩游戏了!
老师来了!,小兰快别玩游戏了!
'''