"""
- 定义:
订阅-发布者模式. 定义在对象间的一对多的依赖. 使得当前对象状态修改时,所有依赖它的对象都会得到通知,并自动更新
- 场景:
1. 消息交换.如:消息队列'
2. 多级触发场景, 如:支持中断模式,一个中断引起连锁反应
- 优点:
1. 观察者 和 被观察者 之间是抽象的耦合
2. 可以将许多符合单一职责原则的模块进行触发,可以实现广播
- 缺点:
1. 观察者模式带来的整体系统效率的浪费
2. 如果被观察者之间有依赖, 梳理逻辑关系比较费心思
"""
class Osberver(object):
"""
# 观察着 基类
"""
def update(self):
pass
class AlarmSensor(Osberver):
"""
# 报警器 观察者
"""
def update(self, action):
print(f'Alarm Got: {action}')
self.runAlarm()
def runAlarm(self):
print('Alarm Ring...')
class WaterSprinker(Osberver):
"""
# 洒水器 观察者
"""
def update(self, action):
print(f'Sprinker Got: {action}')
self.runSprinker()
def runSprinker(self):
print('Spray Water...')
class EmergencyDialer(Osberver):
"""
# 拨号器 观察者
"""
def update(self, action):
print(f'Dial Got: {action}')
self.runDialer()
def runDialer(self):
print('Dial 119...')
class Observed():
observers = []
action = ''
def addObserver(self, observer):
self.observers.append(observer)
def notifyAll(self):
"""
# 通知 各个观察者
:return:
"""
for obs in self.observers:
obs.update(self.action)
class SmokerSensor(Observed):
"""
# 抽烟 被观察者
"""
def setAction(self, action):
"""
# 设置 动作
:param action:
:return:
"""
self.action = action
def isFire(self):
"""
# 触发火灾
:return:
"""
return True
if __name__ == '__main__':
alarm = AlarmSensor()
sprinker = WaterSprinker()
dialer = EmergencyDialer()
smoke_sensor = SmokerSensor()
smoke_sensor.addObserver(alarm)
smoke_sensor.addObserver(sprinker)
smoke_sensor.addObserver(dialer)
if smoke_sensor.isFire():
smoke_sensor.setAction('On Fire')
smoke_sensor.notifyAll()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?