观察者模式包含以下主要角色:
1. 主题(Subject): 被观察的对象,它维护一组观察者,提供方法用于添加和删除观察者,并在状态发生改变时通知观察者。
2. 具体主题(Concrete Subject): 实现了主题接口,负责维护被观察对象的状态,并在状态改变时通知观察者。
3. 观察者(Observer): 定义了一个更新的接口,用于在主题状态发生改变时接收通知。
4. 具体观察者(Concrete Observer): 实现了观察者接口,负责接收主题的通知,并进行相应的更新操作。
下面是一个简单的观察者模式的例子,假设有一个天气站(主题)负责记录和通知当前的天气情况,而多个手机应用程序(观察者)希望在天气改变时得到通知:
# 主题接口
class Subject:
def add_observer(self, observer):
pass
def remove_observer(self, observer):
pass
def notify_observers(self):
pass
# 具体主题类:天气站
class WeatherStation(Subject):
def __init__(self):
self._temperature = 0
self._observers = []
def add_observer(self, observer):
self._observers.append(observer)
def remove_observer(self, observer):
self._observers.remove(observer)
def notify_observers(self):
for observer in self._observers:
observer.update(self._temperature)
def set_temperature(self, temperature):
self._temperature = temperature
self.notify_observers()
# 观察者接口
class Observer:
def update(self, temperature):
pass
# 具体观察者类:手机应用
class MobileApp(Observer):
def __init__(self, name):
self._name = name
def update(self, temperature):
print(f"{self._name} received update. Current temperature: {temperature} C")
# 客户端代码
if __name__ == "__main__":
# 创建天气站和手机应用
weather_station = WeatherStation()
app1 = MobileApp("App 1")
app2 = MobileApp("App 2")
# 注册观察者
weather_station.add_observer(app1)
weather_station.add_observer(app2)
# 模拟天气变化
weather_station.set_temperature(25)
weather_station.set_temperature(30)
在上述示例中,Subject 是主题接口,WeatherStation 是具体主题类。Observer 是观察者接口,MobileApp 是具体观察者类。天气站负责记录天气情况,并在天气变化时通知注册的手机应用。
观察者模式的优点在于它可以实现对象之间的松耦合,使得主题和观察者之间可以相互独立地变化。这使得系统更易于扩展和维护。观察者模式常被用于实现用户界面组件、事件处理系统等场景。
转载请注明出处:http://www.zyzy.cn/article/detail/11857/设计模式