请用python代码说明一下观察者模式
时间: 2023-07-03 18:13:21 浏览: 40
好的,观察者模式是一种设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者(即观察者)都会自动收到通知。
下面是一个基于Python实现的观察者模式示例代码:
```python
class Observer:
def update(self, subject):
pass
class Subject:
def __init__(self):
self.observers = []
def attach(self, observer):
self.observers.append(observer)
def detach(self, observer):
self.observers.remove(observer)
def notify(self):
for observer in self.observers:
observer.update(self)
class ConcreteSubject(Subject):
def __init__(self):
super().__init__()
self._state = None
def get_state(self):
return self._state
def set_state(self, state):
self._state = state
self.notify()
class ConcreteObserver(Observer):
def update(self, subject):
print(f"Observer received new state: {subject.get_state()}")
subject = ConcreteSubject()
observer1 = ConcreteObserver()
observer2 = ConcreteObserver()
subject.attach(observer1)
subject.attach(observer2)
subject.set_state("new state")
# Output:
# Observer received new state: new state
# Observer received new state: new state
subject.detach(observer2)
subject.set_state("another new state")
# Output:
# Observer received new state: another new state
```
在这个示例中,`Observer` 是一个抽象类或接口,定义了一个 `update()` 方法,该方法在主题状态发生变化时被调用。`Subject` 是主题抽象类,定义了管理观察者对象的方法。`ConcreteSubject` 是实际的主题类,具有状态,并在状态变化时通知它的观察者。`ConcreteObserver` 是具体观察者类,它实现了 `Observer` 接口中定义的 `update()` 方法,并在被通知时打印出主题状态的新值。
在示例中,我们创建了一个 `ConcreteSubject` 主题对象,然后创建了两个 `ConcreteObserver` 观察者对象,并将它们附加到主题对象上。然后我们改变主题状态,观察者被通知并打印出新的主题状态值。我们还演示了如何从主题对象中分离一个观察者对象,以便它不再接收主题状态的更新。