观察者模式常常用于以下场景:
事件驱动系统:当事件发生时,通知所有对该事件感兴趣的观察者。
发布/订阅模型:一个主题(发布者)可以有多个订阅者(观察者),当主题发生改变时,通知所有订阅者。
GUI编程:当GUI组件状态发生改变时,通知对该组件感兴趣的观察者(例如,当用户单击按钮时,可以通知所有与该按钮关联的处理程序)。
消息队列系统:在消息队列系统中,观察者模式用于订阅者从队列中获取消息的方式,当消息可用时,通知所有订阅者。
总之,观察者模式适用于任何需要多个对象之间协作的场景,以便在对象之间保持松散耦合。
下面是一个简单的观察者模式的示例代码:
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, message):
for observer in self._observers:
observer.update(message)
class Observer:
def update(self, message):
print(f'Received message: {message}')
subject = Subject()
observer1 = Observer()
observer2 = Observer()
subject.attach(observer1)
subject.attach(observer2)
subject.notify('Hello world')
subject.detach(observer1)
subject.notify('Goodbye')
执行过程如下:
定义了一个 Subject 主题类,其中包含了一组观察者 _observers,以及 attach()、detach() 和 notify() 方法用于添加、删除观察者和通知观察者。
定义了一个 Observer 观察者类,其中包含了一个 update() 方法用于处理接收到的通知消息。
创建了一个 Subject 实例 subject 和两个 Observer 实例 observer1 和 observer2。
调用 subject.attach(observer1) 和 subject.attach(observer2) 将观察者注册到主题中。
调用 subject.notify('Hello world') 向所有已注册的观察者发送消息,观察者会调用自己的 update() 方法进行处理。
调用 subject.detach(observer1) 将 observer1 观察者从主题中删除。
调用 subject.notify('Goodbye') 向所有已注册的观察者发送消息,但是 observer1 不会收到该消息,只有 observer2 会调用自己的 update() 方法进行处理。