Python 设计模式之观察者模式

2023-04-03 00:00:00 模式 设计 观察者

观察者模式是一种行为设计模式,它允许一个对象(称为主题)维护其状态,并在状态发生改变时通知其依赖项(称为观察者),以便它们可以根据最新的状态进行更新。

观察者模式有三个核心组件:主题(Subject)、观察者(Observer)和通知(Notification)。主题维护其状态,并提供一些方法来添加、删除和通知观察者。观察者定义一个更新方法,该方法在接收到通知时被调用,以便它可以更新自己。通知是传递给观察者的消息,其中包含主题的当前状态。

下面是一个 Python 实现的观察者模式的示例:

class Subject:
    def __init__(self):
        self._observers = []

    def attach(self, observer):
        if observer not in self._observers:
            self._observers.append(observer)

    def detach(self, observer):
        try:
            self._observers.remove(observer)
        except ValueError:
            pass

    def notify(self, message):
        for observer in self._observers:
            observer.update(message)


class Observer:
    def update(self, message):
        pass


class ConcreteSubject(Subject):
    def __init__(self, state=None):
        super().__init__()
        self._state = state

    @property
    def state(self):
        return self._state

    @state.setter
    def state(self, state):
        self._state = state
        self.notify(state)


class ConcreteObserver(Observer):
    def update(self, message):
        print(f'Received message: {message}')


# 示例
subject = ConcreteSubject()
observer_a = ConcreteObserver()
observer_b = ConcreteObserver()

subject.attach(observer_a)
subject.attach(observer_b)

subject.state = 'pidancode.com'
subject.detach(observer_b)

subject.state = '皮蛋编程'

在这个示例中,Subject 类表示主题,它维护其状态并提供 attach、detach 和 notify 方法以添加、删除和通知观察者。Observer 类表示观察者,它定义一个 update 方法,在接收到通知时被调用以更新自己。ConcreteSubject 和 ConcreteObserver 是具体的实现,它们继承自 Subject 和 Observer,并实现了它们的方法。

在示例中,创建了一个 ConcreteSubject 对象,并添加了两个 ConcreteObserver 观察者。当主题的状态发生改变时,它会调用 notify 方法并将新状态传递给观察者。```
在这个示例中,观察者只是简单地打印了接收到的消息。

当运行示例时,输出将是:

Received message: pidancode.com
Received message: 皮蛋编程

这表明观察者已经成功接收到了主题的通知,并进行了更新。

相关文章