返回

探秘观察者模式与发布订阅者模式的本质差异

前端

在软件开发中,设计模式是一种经过验证的解决方案,可以重复使用,以解决常见的问题。观察者模式和发布订阅者模式都是设计模式,它们都可以实现对象之间的通信,但它们在实现方式和应用场景上存在着本质的不同。

观察者模式

观察者模式是一种对象的行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。当主题对象的状态发生变化时,它会自动通知所有观察者对象,以便它们可以相应地更新自己。

观察者模式的代码实现如下:

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!")

两者的区别

观察者模式和发布订阅者模式都是设计模式,它们都可以实现对象之间的通信,但它们在实现方式和应用场景上存在着本质的不同。

  • 实现方式不同

观察者模式是一种拉模式,即观察者对象需要主动地去获取主题对象的状态。而发布订阅者模式是一种推模式,即发布者对象会主动地将消息推送到订阅者对象。

  • 应用场景不同

观察者模式通常用于实现对象之间的紧耦合,当主题对象的状态发生变化时,所有观察者对象都会收到通知。而发布订阅者模式通常用于实现对象之间的松耦合,订阅者对象可以自由地订阅或取消订阅发布者对象,而不会影响到其他订阅者对象。

  • 适用场景不同

观察者模式适用于需要紧密耦合的对象之间的通信,例如,当一个对象的属性发生变化时,其他对象需要立即更新。发布订阅者模式适用于需要松散耦合的对象之间的通信,例如,当一个对象需要向其他对象发送消息,但不需要知道这些对象是谁。

总结

观察者模式和发布订阅者模式都是设计模式,它们都可以实现对象之间的通信,但它们在实现方式和应用场景上存在着本质的不同。观察者模式是一种拉模式,通常用于实现对象之间的紧耦合,而发布订阅者模式是一种推模式,通常用于实现对象之间的松耦合。