请给出一个观察者模式的Python代码
时间: 2023-06-26 09:03:49 浏览: 51
下面是一个观察者模式的 Python 代码示例,假设有一个主题(Subject)和多个观察者(Observer),主题有一个状态(state),当状态改变时,所有观察者都会收到通知并执行相应的操作:
```python
class Subject:
def __init__(self):
self.state = None
self.observers = []
def attach(self, observer):
self.observers.append(observer)
def detach(self, observer):
self.observers.remove(observer)
def notify(self, new_state):
for observer in self.observers:
observer.update(new_state)
class Observer:
def update(self, new_state):
pass
class ConcreteSubject(Subject):
def set_state(self, new_state):
self.state = new_state
self.notify(new_state)
class ConcreteObserver(Observer):
def __init__(self, name):
self.name = name
def update(self, new_state):
print(f"{self.name} received new state: {new_state}")
if __name__ == '__main__':
subject = ConcreteSubject()
observer1 = ConcreteObserver("Observer 1")
observer2 = ConcreteObserver("Observer 2")
subject.attach(observer1)
subject.attach(observer2)
subject.set_state("new state")
subject.detach(observer2)
subject.set_state("new new state")
```
在这个示例中, `Subject` 类是主题类,具有一个状态(`state`)和一组观察者(`observers`)。`attach` 方法用于在主题中注册一个观察者,`detach` 方法用于注销观察者,`notify` 方法用于通知所有观察者状态的变化。
`Observer` 类是观察者类,具有一个 `update` 方法,用于在状态发生变化时执行相应的操作。
`ConcreteSubject` 类是主题类的具体实现,具有一个 `set_state` 方法,用于设置主题的状态,并通知所有的观察者。
`ConcreteObserver` 类是观察者类的具体实现,具有一个 `name` 属性用于标识观察者,`update` 方法用于在状态发生变化时输出观察者收到的新状态信息。
在 `main` 函数中,我们创建了一个主题和两个观察者,将两个观察者注册到主题中,并通过 `set_state` 方法改变主题的状态,观察者会收到相应的通知并输出新的状态信息。然后我们注销了一个观察者,并再次改变主题的状态,只有一个观察者会收到新的状态信息。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)