跳转至

观察者模式

观察者模式

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听和更新某一个主题对象的状态。

观察者模式的特点

  1. 主题与观察者解耦:主题对象和观察者对象之间解耦,使得主题对象可以独立地改变和通知观察者。
  2. 支持广播通知:主题对象状态发生改变时,能够自动通知所有注册的观察者对象。
  3. 动态注册和删除观察者:支持动态地添加和移除观察者对象。

观察者模式的结构

  1. 主题(Subject):维护一组观察者对象,并提供方法来注册、删除和通知观察者。
  2. 观察者(Observer):定义了接收通知和更新状态的接口。
  3. 具体主题(Concrete Subject):具体的主题对象,维护具体的状态,并在状态发生变化时通知观察者。
  4. 具体观察者(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 1 received message: Updated State
Observer 2 received message: Updated State

说明

  1. 观察者接口(Observer):定义了观察者对象接收通知和更新状态的方法。
  2. 主题类(Subject):维护观察者对象列表,并提供注册、移除和通知观察者的方法。
  3. 具体观察者类(ConcreteObserver):实现了观察者接口,具体实现接收通知和更新状态的逻辑。
  4. 具体主题类(ConcreteSubject):继承自主题类,维护具体的状态,并在状态变化时通知所有注册的观察者。

观察者模式通过将主题和观察者解耦,使得主题对象可以独立地管理状态变化,并通知所有相关的观察者对象。这种模式适用于对象之间存在一对多的依赖关系,其中一个对象的状态变化需要通知多个其他对象的场景。

评论