Python观察者模式介绍、使用方法
发布人:shili8
发布时间:2025-03-13 01:26
阅读次数:0
**Python 观察者模式介绍**
在软件设计中,观察者模式是一种常见的设计模式,它允许一个对象(被观察者)将其状态改变通知给其他对象(观察者)。这种模式非常有用,当我们需要在多个对象之间建立一种松散耦合的关系时。
**观察者模式定义**
观察者模式是一种行为设计模式,定义如下:
* **被观察者(Subject)**:一个或多个对象,它们维护了一个观察者的列表,并且可以向这些观察者发送通知。
* **观察者(Observer)**:一个或多个对象,它们感兴趣于被观察者的状态改变,并且会在收到通知时做出相应的反应。
**观察者模式使用方法**
下面是一个简单的例子,演示了如何使用观察者模式:
### 观察者模式类图
markdown+---------------+ | 被观察者 | +---------------+ | | notifyObservers() v+---------------+ +---------------+ | 观察者1 | | 观察者2 | +---------------+ +---------------+ | | | update() | v v+---------------+ +---------------+ | 处理观察者1的更新 | | 处理观察者2的更新 | +---------------+ +---------------+
### 观察者模式示例代码
from abc import ABC, abstractmethod# 被观察者类class Subject(ABC):
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 @abstractmethod def notify(self):
"""通知所有观察者"""
pass# 观察者类class Observer(ABC):
@abstractmethod def update(self, subject):
"""更新自身状态"""
pass# 具体的被观察者类class Data(Subject):
def __init__(self, name=''):
super().__init__()
self.name = name def notify(self):
for observer in self._observers:
observer.update(self)
# 具体的观察者类class HexViewer(Observer):
def update(self, subject):
print(f'Hex viewer: {subject.name} has changed to0x{subject.data:02X}')
class DecimalViewer(Observer):
def update(self, subject):
print(f'Decimal viewer: {subject.name} has changed to {subject.data}')
# 使用示例if __name__ == '__main__':
data = Data('Test')
hex_viewer = HexViewer()
decimal_viewer = DecimalViewer()
data.attach(hex_viewer)
data.attach(decimal_viewer)
data.data =10 data.notify() # Output: Hex viewer: Test has changed to0x0A, Decimal viewer: Test has changed to10 data.detach(hex_viewer)
data.data =20 data.notify() # Output: Decimal viewer: Test has changed to20在这个例子中,我们定义了一个 `Subject` 类,代表被观察者,它维护了一个观察者的列表,并且可以向这些观察者发送通知。我们还定义了一个 `Observer` 类,代表观察者,它感兴趣于被观察者的状态改变,并且会在收到通知时做出相应的反应。
具体来说,我们创建了一个 `Data` 类作为被观察者,它维护了一个数据值和一个观察者的列表。我们还创建了两个 `HexViewer` 和 `DecimalViewer` 类作为观察者,它们感兴趣于 `Data` 的状态改变,并且会在收到通知时打印出相应的信息。
最后,我们使用示例代码演示了如何将观察者添加到被观察者的列表中,如何从列表中移除观察者,以及如何向所有观察者发送通知。

