观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。观察者模式将对象之间的耦合度降低,使得一个对象的变化可以通知其他对象,而不需要它们之间相互了解细节。

观察者模式包含以下主要角色:

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/设计模式