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` 的状态改变,并且会在收到通知时打印出相应的信息。
最后,我们使用示例代码演示了如何将观察者添加到被观察者的列表中,如何从列表中移除观察者,以及如何向所有观察者发送通知。