展览搭建设计网站,五家渠网站建设,已经有域名 怎么做网站,wordpress图片弹窗在 Python 中实现观察者模式可以遵循以下具体步骤#xff0c;这些步骤清晰地划分了角色和交互流程#xff1a;
步骤 1#xff1a;定义主题#xff08;Subject#xff09;基类
主题是被观察的对象#xff0c;负责管理观察者和发送通知。需实现以下核心方法#xff1a;
存…在 Python 中实现观察者模式可以遵循以下具体步骤这些步骤清晰地划分了角色和交互流程
步骤 1定义主题Subject基类
主题是被观察的对象负责管理观察者和发送通知。需实现以下核心方法
存储观察者的容器如列表添加观察者的方法attach移除观察者的方法detach通知所有观察者的方法notify
class Subject:def __init__(self):self._observers [] # 保存所有注册的观察者def attach(self, observer):添加观察者到列表if observer not in self._observers:self._observers.append(observer)def detach(self, observer):从列表中移除观察者try:self._observers.remove(observer)except ValueError:pass # 忽略未找到的观察者def notify(self, *args, **kwargs):通知所有观察者状态变化for observer in self._observers:observer.update(*args, **kwargs) # 调用观察者的更新方法步骤 2实现具体主题ConcreteSubject
具体主题是实际业务对象维护自身状态当状态变化时触发通知。
class WeatherStation(Subject): # 继承主题基类def __init__(self):super().__init__()self._temperature None # 示例温度状态propertydef temperature(self):return self._temperaturetemperature.setterdef temperature(self, new_temp):self._temperature new_temp # 更新状态self.notify(new_temp) # 状态变化时通知观察者步骤 3定义观察者Observer基类/接口
观察者是接收通知的对象需定义一个更新方法update供主题调用。
class Observer:def update(self, *args, **kwargs):接收主题通知的方法子类必须实现raise NotImplementedError(子类必须重写 update 方法)步骤 4实现具体观察者ConcreteObserver
具体观察者根据自身需求实现update方法处理主题发送的通知。
class PhoneDisplay(Observer): # 手机显示屏观察者def update(self, temp):print(f手机显示当前温度 {temp}°C)class WindowDisplay(Observer): # 窗口显示屏观察者def update(self, temp):print(f窗口显示温度更新为 {temp}°C)步骤 5使用观察者模式
创建主题和观察者实例关联它们并触发状态变化验证效果。
# 1. 创建主题被观察者
weather_station WeatherStation()# 2. 创建观察者
phone_display PhoneDisplay()
window_display WindowDisplay()# 3. 注册观察者到主题
weather_station.attach(phone_display)
weather_station.attach(window_display)# 4. 改变主题状态自动通知观察者
print(--- 温度变为 25°C ---)
weather_station.temperature 25print(\n--- 温度变为 30°C ---)
weather_station.temperature 30# 5. 移除一个观察者
weather_station.detach(phone_display)
print(\n--- 移除手机显示后温度变为 28°C ---)
weather_station.temperature 28执行结果
--- 温度变为 25°C ---
手机显示当前温度 25°C
窗口显示温度更新为 25°C--- 温度变为 30°C ---
手机显示当前温度 30°C
窗口显示温度更新为 30°C--- 移除手机显示后温度变为 28°C ---
窗口显示温度更新为 28°C核心逻辑总结
主题与观察者解耦主题只需知道观察者有update方法无需了解其具体实现观察者也无需知道主题的内部逻辑。动态关联通过attach和detach可以随时添加/移除观察者灵活性高。自动通知主题状态变化时主动调用所有注册观察者的update方法实现一处变化多处响应。
这种模式适用于事件监听、状态同步、发布-订阅系统等场景例如 GUI 中的按钮点击事件、数据更新通知等。