观察者模式
观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听和更新某一个主题对象的状态。
观察者模式的特点
- 主题与观察者解耦:主题对象和观察者对象之间解耦,使得主题对象可以独立地改变和通知观察者。
- 支持广播通知:主题对象状态发生改变时,能够自动通知所有注册的观察者对象。
- 动态注册和删除观察者:支持动态地添加和移除观察者对象。
观察者模式的结构
- 主题(Subject):维护一组观察者对象,并提供方法来注册、删除和通知观察者。
- 观察者(Observer):定义了接收通知和更新状态的接口。
- 具体主题(Concrete Subject):具体的主题对象,维护具体的状态,并在状态发生变化时通知观察者。
- 具体观察者(Concrete Observer):具体的观察者对象,实现接收通知和更新的具体逻辑。
观察者模式的Python实现
以下是观察者模式在Python中的一个简单实现示例:
1. 定义观察者接口和主题类
from abc import ABC, abstractmethod
# 观察者接口
class Observer(ABC):
@abstractmethod
def update(self, message):
pass
# 主题类
class Subject:
def __init__(self):
self._observers = []
def register_observer(self, observer):
self._observers.append(observer)
def unregister_observer(self, observer):
self._observers.remove(observer)
def notify_observers(self, message):
for observer in self._observers:
observer.update(message)
2. 定义具体观察者和具体主题类
# 具体观察者类
class ConcreteObserver(Observer):
def __init__(self, name):
self._name = name
def update(self, message):
print(f"{self._name} received message: {message}")
# 具体主题类
class ConcreteSubject(Subject):
def __init__(self, state):
super().__init__()
self._state = state
def get_state(self):
return self._state
def set_state(self, state):
self._state = state
self.notify_observers(state)
3. 客户端代码
if __name__ == "__main__":
subject = ConcreteSubject("Initial State")
observer1 = ConcreteObserver("Observer 1")
observer2 = ConcreteObserver("Observer 2")
subject.register_observer(observer1)
subject.register_observer(observer2)
subject.set_state("Updated State")
运行结果
说明
- 观察者接口(Observer):定义了观察者对象接收通知和更新状态的方法。
- 主题类(Subject):维护观察者对象列表,并提供注册、移除和通知观察者的方法。
- 具体观察者类(ConcreteObserver):实现了观察者接口,具体实现接收通知和更新状态的逻辑。
- 具体主题类(ConcreteSubject):继承自主题类,维护具体的状态,并在状态变化时通知所有注册的观察者。
观察者模式通过将主题和观察者解耦,使得主题对象可以独立地管理状态变化,并通知所有相关的观察者对象。这种模式适用于对象之间存在一对多的依赖关系,其中一个对象的状态变化需要通知多个其他对象的场景。