📅  最后修改于: 2023-12-03 15:41:33.797000             🧑  作者: Mango
观察者方法是一种设计模式,它允许一个对象在状态改变时通知其他依赖于它的对象。观察者方法通常用于解耦合,让我们的代码更加灵活、可重用。
在 Python 中,我们通常使用内置的 Observer
类来实现观察者方法。以下是一个简单的例子:
from abc import ABCMeta, abstractmethod
from typing import List, Tuple
class Observer(metaclass=ABCMeta):
"""
抽象观察者类,定义了观察者的基本行为
"""
@abstractmethod
def update(self, *args, **kwargs):
pass
class Subject:
"""
主题类,定义了观察者可以观察的对象
"""
def __init__(self) -> None:
self._observers: List[Observer] = []
def attach(self, observer: Observer):
self._observers.append(observer)
def detach(self, observer: Observer):
self._observers.remove(observer)
def notify(self, *args, **kwargs):
for observer in self._observers:
observer.update(*args, **kwargs)
class MyObserver(Observer):
"""
具体观察者类,实现对主题的观测行为
"""
def update(self, temperature: float, humidity: float):
print(f"温度: {temperature:.2f}C, 湿度: {humidity:.2f}%")
if __name__ == "__main__":
weather_station = Subject()
observer_1 = MyObserver()
observer_2 = MyObserver()
observer_3 = MyObserver()
weather_station.attach(observer_1)
weather_station.attach(observer_2)
weather_station.attach(observer_3)
weather_station.notify(24.5, 70)
在这个例子中,我们创建了一个 Observer
抽象类,定义了观察者的基本行为。我们还创建了一个 Subject
类,它定义了我们可以观察的对象,并提供了 attach
、detach
和 notify
方法来处理观察者的管理和通知。最后,我们编写了一个 MyObserver
具体观察者类,它实现了对主题的观测行为。
在我们的 main
函数中,我们创建了一个 Subject
实例和三个 MyObserver
实例。我们通过 attach
方法将这三个实例添加到主题中,然后通过 notify
方法通知所有的观察者。我们可以看到,当主题的状态变化时,每个观察者都会收到通知并执行相应的行为。
观察者方法的优点包括:
观察者方法的缺点包括: