观察模式(Observer Pattern)是一种软件设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。当主题对象发生变化时,它会通知所有的观察者,使得观察者对象能够自动更新。
我们最常见的使用的场景就是订阅--发布模式,像微信公众号一样,我们可以关注某个公司的公众号,关注后,只要有发布信息就能推送,而且还不是强耦合的,可以取消订阅读。
以下是一个使用Python实现观察模式的示例:我们通过代码来解读
class Subject:
def __init__(self):
self.observers = [] #定一个数组,用于存储订阅者
self.state = None
#定义一个订阅方法
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()#循环对每个订阅者进行信息推送
def get_state(self):
return self.state
def set_state(self, state):
self.state = state
self.notify()#这个代码是更整个代码最核心代码,没有之一,当有信息发布时,执行updte()进行推送。
class Observer:
def __init__(self, subject):
self.subject = subject
self.subject.attach(self)
def update(self):
print("Observer received the updated state:", self.subject.get_state())
# 客户端代码
subject = Subject()
observer1 = Observer(subject)#初始化订阅者就进行绑定工作。
observer2 = Observer(subject)#初始化订阅者就进行绑定工作。
subject.set_state(1)#发布消息1
subject.set_state(2)#发布消息2
subject.detach(observer2)
subject.set_state(3)#发布消息3
在上述示例中,Subject
类是主题对象,包含了一组观察者对象并维护了它们的状态。Observer
类是观察者对象,每个观察者对象都会注册到主题对象上,当主题对象的状态发生变化时,它会通过调用观察者对象的update()
方法,通知观察者更新自己的状态。
运行上述代码,输出如下:
Observer received the updated state: 1
Observer received the updated state: 1
Observer received the updated state: 2