Python设计模式:观察者模式
观察者模式(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 中实现观察者模式也非常简单,只需要定义好主题和观察者的接口,并让具体的被观察者和观察者继承这些接口即可。
相关文章