观察者模式,又称为发布-订阅模式,是软件设计中的一种行为模式,它允许一个对象,即主题(Subject),在状态变化时通知其所有依赖者,即观察者(Observer)。这种模式强调的是对象间的松耦合,使得系统更加灵活,易于扩展。
在Python中,观察者模式通常通过定义两个主要角色来实现:`Subject`(主题)和`Observer`(观察者)。`Subject`是被观察的对象,它可以是任何类型的数据或状态,当其状态发生改变时,会通知所有注册的观察者。`Observer`则负责接收并响应`Subject`的通知,执行相应的更新操作。
在提供的示例中,`Subject`类定义如下:
```python
class subject():
def __init__(self, dat):
self.listobj = list() # 用于存储观察者的列表
self.dat = dat
def registerObject(self, obj):
self.listobj.append(obj)
def removeObject(self, obj):
pass
def notifyObservers(self):
for i in range(len(self.listobj)):
self.listobj[i].update()
def setdat(self, new_dat):
if self.dat != new_dat:
self.dat = new_dat
self.notifyObservers()
```
`Subject`有一个`listobj`列表来存储注册的观察者,并提供了`registerObject`方法来添加新的观察者。`setdat`方法用于更改数据,并在数据改变后调用`notifyObservers`通知所有观察者。
`Observer`类如下:
```python
class observer():
def __init__(self, sub):
self.sub = sub
self.sub.registerObject(self)
self.number = self.sub.dat
def update(self):
self.number = self.sub.dat
def display(self):
print(self.number)
```
`Observer`类在初始化时订阅`Subject`,并将自己添加到`Subject`的观察者列表中。当`Subject`的数据变化时,`Observer`的`update`方法会被调用,从而更新自己的状态。
在主程序中,创建一个`Subject`实例`su`,然后创建两个`Observer`实例`ob1`和`ob2`,它们都订阅`su`。当`su`的状态改变(如`setdat(11)`),`ob1`和`ob2`都会收到通知并更新自己的状态。
观察者模式遵循面向对象设计原则中的开闭原则,即对扩展开放,对修改关闭。在该模式下,当增加新的观察者类型或改变主题时,只需要关注对应类的实现,无需修改其他已有的代码。
Python中的观察者模式通过将主题与观察者解耦,使得系统具有更好的可扩展性和维护性。它常被应用于事件驱动编程、实时数据更新、多线程同步等场景,是构建复杂系统不可或缺的工具。