当前位置:实例文章 » 其他实例» [文章]Python观察者模式介绍、使用方法

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` 的状态改变,并且会在收到通知时打印出相应的信息。

最后,我们使用示例代码演示了如何将观察者添加到被观察者的列表中,如何从列表中移除观察者,以及如何向所有观察者发送通知。

其他信息

其他资源

Top