欢迎访问宙启技术站
智能推送

详解Python中Observer()模式与发布-订阅模式的区别

发布时间:2023-12-13 09:12:34

Observer模式和发布-订阅模式都是软件设计模式中的一种。这两种模式在实现方式上有一些不同,下面会详细介绍它们的区别,并提供一个使用例子做进一步说明。

1. Observer模式:

Observer模式也称为观察者模式,它是一种行为型模式。在Observer模式中,存在一个被观察者(Subject)和多个观察者(Observers)。当被观察者发生状态变化时,它会通知所有的观察者,使得观察者可以进行相应的处理。

使用Observer模式的一般步骤如下:

- 定义Observer接口,该接口包含一个用于接收通知的方法。

- 定义Subject类,该类保存所有观察者的引用,并提供方法用于添加、删除和通知观察者。

- 定义具体的观察者类,实现Observer接口的方法。

- 定义具体的被观察者类,维护一个观察者列表,并在状态变化时通知所有观察者。

下面是一个使用Observer模式的例子:

# Observer接口
class Observer:
    def update(self, subject):
        pass

# Subject类
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 ConcreteObserver(Observer):
    def update(self, subject):
        print("Subject has been updated:", subject)

# 具体的被观察者类
class ConcreteSubject(Subject):
    def __init__(self):
        super().__init__()
        self.state = None
    
    def set_state(self, state):
        self.state = state
        self.notify()

# 使用Observer模式
subject = ConcreteSubject()
observer1 = ConcreteObserver()
observer2 = ConcreteObserver()

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

subject.set_state(1)
subject.detach(observer2)
subject.set_state(2)

输出结果为:

Subject has been updated: <__main__.ConcreteSubject object at 0x7f8d4ea91790>
Subject has been updated: <__main__.ConcreteSubject object at 0x7f8d4ea91790>

2. 发布-订阅模式:

发布-订阅模式是一种消息传递模式,也被称为观察者模式的变型。在发布-订阅模式中,存在一个消息中心(Message Broker)来管理消息的发布和订阅。发布者(Publisher)将消息发布到消息中心,而订阅者(Subscriber)则通过订阅消息中心来接收特定类型的消息。

使用发布-订阅模式的一般步骤如下:

- 定义消息中心类,该类负责管理消息的发布和订阅,并维护一个订阅者列表。

- 定义发布者类,该类负责发布消息到消息中心。

- 定义订阅者类,该类负责通过订阅消息中心来接收特定类型的消息。

下面是一个使用发布-订阅模式的例子:

# 消息中心类
class MessageBroker:
    def __init__(self):
        self.subscribers = {}
    
    def subscribe(self, topic, subscriber):
        if topic not in self.subscribers:
            self.subscribers[topic] = []
        self.subscribers[topic].append(subscriber)
    
    def unsubscribe(self, topic, subscriber):
        if topic in self.subscribers:
            self.subscribers[topic].remove(subscriber)
    
    def publish(self, topic, message):
        if topic in self.subscribers:
            for subscriber in self.subscribers[topic]:
                subscriber.receive(message)

# 发布者类
class Publisher:
    def __init__(self, broker):
        self.broker = broker
    
    def publish_message(self, topic, message):
        self.broker.publish(topic, message)

# 订阅者类
class Subscriber:
    def __init__(self, id):
        self.id = id
    
    def receive(self, message):
        print("Subscriber", self.id, "received message:", message)

# 使用发布-订阅模式
broker = MessageBroker()
publisher = Publisher(broker)
subscriber1 = Subscriber(1)
subscriber2 = Subscriber(2)
subscriber3 = Subscriber(3)

broker.subscribe("topic1", subscriber1)
broker.subscribe("topic2", subscriber2)
broker.subscribe("topic2", subscriber3)

publisher.publish_message("topic1", "Hello")
publisher.publish_message("topic2", "World")

输出结果为:

Subscriber 1 received message: Hello
Subscriber 2 received message: World
Subscriber 3 received message: World

总结:

Observer模式和发布-订阅模式在实现方式上有一些不同:

- Observer模式中,观察者直接与被观察者通信,而在发布-订阅模式中,发布者和订阅者通过消息中心来通信。

- Observer模式中,观察者需要显式地将自己添加到被观察者的观察者列表中,而发布-订阅模式中,订阅者通过订阅消息中心来接收消息。

选择使用哪种模式主要取决于具体的场景和需求。如果需要简单地进行对象间的通信,可以使用Observer模式。如果需要更灵活和松耦合的方式来处理消息传递,可以使用发布-订阅模式。