Python设计模式:观察者模式

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

观察者模式(Observer Pattern)是一种常见的设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生改变时,所有依赖于它的观察者都会得到通知并更新自己的状态。

在 Python 中实现观察者模式,一般需要以下几个角色:

  • 主题(Subject):被观察的对象,它包含了观察者列表,以及添加、删除、通知观察者的方法。
  • 观察者(Observer):观察主题的对象,它定义了接收通知并更新自己状态的方法。
  • 具体主题(ConcreteSubject):具体的被观察者对象,它实现了主题接口中定义的方法,可以被观察者订阅和通知。
  • 具体观察者(ConcreteObserver):具体的观察者对象,它实现了观察者接口中定义的方法,可以接收到被观察者的通知并进行处理。

下面是一个简单的 Python 实现:

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):
        for observer in self.observers:
            observer.update(self)


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


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

    def get_state(self):
        return self.state

    def set_state(self, state):
        self.state = state
        self.notify()


class ConcreteObserver(Observer):
    def update(self, subject):
        print(f"Observer {id(self)} received notification with state {subject.get_state()}")


# Test the observer pattern
subject = ConcreteSubject()
observer1 = ConcreteObserver()
observer2 = ConcreteObserver()

subject.attach(observer1)
subject.attach(observer2)

subject.set_state("state 1")

subject.detach(observer2)

subject.set_state("state 2")

这个实现中,Subject 类是主题的抽象类,其中定义了添加、删除、通知观察者的方法。Observer 类是观察者的抽象类,其中定义了接收通知并更新自己状态的方法。ConcreteSubject 类是具体的被观察者对象,它实现了主题接口中定义的方法,并保存了自己的状态。ConcreteObserver 类是具体的观察者对象,它实现了观察者接口中定义的方法,并在接收到通知时打印出被观察者的状态。

在测试部分,我们创建了一个具体的被观察者对象 subject,并创建了两个观察者对象 observer1 和 observer2。然后将这两个观察者对象订阅读上面的 Python 代码,将 observer1 和 observer2 添加到 subject 的观察者列表中,然后通过 subject.set_state() 方法来设置被观察者的状态并通知观察者。在第二次调用 subject.set_state() 方法之前,我们将 observer2 从观察者列表中移除,这样当再次调用 subject.set_state() 方法时,只有 observer1 会接收到通知。

如果你运行这段代码,将会看到以下输出:

Observer 140133246607808 received notification with state state 1
Observer 140133246607872 received notification with state state 1
Observer 140133246607808 received notification with state state 2

可以看到,当被观察者的状态发生改变时,所有观察者都会收到通知,并进行相应的处理。当其中一个观察者被移除后,只有另一个观察者会收到通知。

总结一下,观察者模式是一种很有用的设计模式,它可以让多个对象之间建立松散的耦合关系,提高程序的可维护性和扩展性。在 Python 中实现观察者模式也非常简单,只需要定义好主题和观察者的接口,并让具体的被观察者和观察者继承这些接口即可。

相关文章