探秘观察者模式与发布订阅者模式的本质差异
2023-11-17 14:41:17
在软件开发中,设计模式是一种经过验证的解决方案,可以重复使用,以解决常见的问题。观察者模式和发布订阅者模式都是设计模式,它们都可以实现对象之间的通信,但它们在实现方式和应用场景上存在着本质的不同。
观察者模式
观察者模式是一种对象的行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。当主题对象的状态发生变化时,它会自动通知所有观察者对象,以便它们可以相应地更新自己。
观察者模式的代码实现如下:
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()
class Observer:
def __init__(self, subject):
self._subject = subject
subject.attach(self)
def update(self):
print("Observer:", self, "has been notified.")
if __name__ == "__main__":
subject = Subject()
observer1 = Observer(subject)
observer2 = Observer(subject)
subject.notify()
发布订阅者模式
发布订阅者模式是一种消息传递设计模式,它定义了一种一对多的依赖关系,让多个订阅者对象同时接收一个发布者对象发布的消息。当发布者对象发布消息时,所有订阅者对象都会收到该消息,并做出相应的处理。
发布订阅者模式的代码实现如下:
class Publisher:
def __init__(self):
self._subscribers = []
def add_subscriber(self, subscriber):
self._subscribers.append(subscriber)
def remove_subscriber(self, subscriber):
self._subscribers.remove(subscriber)
def publish(self, message):
for subscriber in self._subscribers:
subscriber.receive_message(message)
class Subscriber:
def __init__(self, publisher):
self._publisher = publisher
publisher.add_subscriber(self)
def receive_message(self, message):
print("Subscriber:", self, "has received message:", message)
if __name__ == "__main__":
publisher = Publisher()
subscriber1 = Subscriber(publisher)
subscriber2 = Subscriber(publisher)
publisher.publish("Hello, world!")
两者的区别
观察者模式和发布订阅者模式都是设计模式,它们都可以实现对象之间的通信,但它们在实现方式和应用场景上存在着本质的不同。
- 实现方式不同
观察者模式是一种拉模式,即观察者对象需要主动地去获取主题对象的状态。而发布订阅者模式是一种推模式,即发布者对象会主动地将消息推送到订阅者对象。
- 应用场景不同
观察者模式通常用于实现对象之间的紧耦合,当主题对象的状态发生变化时,所有观察者对象都会收到通知。而发布订阅者模式通常用于实现对象之间的松耦合,订阅者对象可以自由地订阅或取消订阅发布者对象,而不会影响到其他订阅者对象。
- 适用场景不同
观察者模式适用于需要紧密耦合的对象之间的通信,例如,当一个对象的属性发生变化时,其他对象需要立即更新。发布订阅者模式适用于需要松散耦合的对象之间的通信,例如,当一个对象需要向其他对象发送消息,但不需要知道这些对象是谁。
总结
观察者模式和发布订阅者模式都是设计模式,它们都可以实现对象之间的通信,但它们在实现方式和应用场景上存在着本质的不同。观察者模式是一种拉模式,通常用于实现对象之间的紧耦合,而发布订阅者模式是一种推模式,通常用于实现对象之间的松耦合。