返回

深入探讨发布订阅模式的精简实现,从8行到3行,揭秘精简背后的玄机

前端

发布订阅模式简介

发布订阅模式是一种消息传递模式,允许发布者将消息发布到频道,而订阅者可以订阅该频道以接收消息。发布者和订阅者之间没有直接的耦合,这使得发布订阅模式非常灵活和可扩展。

3行实现

发布订阅模式最简单的实现只需要3行代码:

class Publisher:
    def __init__(self):
        self.subscribers = []

    def publish(self, message):
        for subscriber in self.subscribers:
            subscriber.receive(message)

class Subscriber:
    def __init__(self, publisher):
        publisher.subscribers.append(self)

    def receive(self, message):
        print(message)

# 创建发布者和订阅者
publisher = Publisher()
subscriber1 = Subscriber(publisher)
subscriber2 = Subscriber(publisher)

# 发布消息
publisher.publish("Hello, world!")

在这个实现中,Publisher类包含一个subscribers列表,其中存储了所有订阅者的引用。当发布者调用publish()方法时,它会遍历subscribers列表,并调用每个订阅者的receive()方法。

6行实现

6行实现与3行实现非常相似,但它增加了对主题的支持。主题允许订阅者只订阅感兴趣的消息。

class Publisher:
    def __init__(self):
        self.subscribers = {}

    def publish(self, topic, message):
        for subscriber in self.subscribers.get(topic, []):
            subscriber.receive(message)

class Subscriber:
    def __init__(self, publisher):
        self.publisher = publisher
        self.topics = []

    def subscribe(self, topic):
        self.topics.append(topic)
        self.publisher.subscribers.setdefault(topic, []).append(self)

    def receive(self, message):
        print(message)

# 创建发布者和订阅者
publisher = Publisher()
subscriber1 = Subscriber(publisher)
subscriber2 = Subscriber(publisher)

# 订阅者1订阅主题"topic1"
subscriber1.subscribe("topic1")

# 订阅者2订阅主题"topic2"
subscriber2.subscribe("topic2")

# 发布消息
publisher.publish("topic1", "Hello, world!")
publisher.publish("topic2", "Good morning!")

在这个实现中,Publisher类包含一个subscribers字典,其中存储了主题与订阅者列表的映射。当发布者调用publish()方法时,它会查找指定主题的订阅者列表,并调用每个订阅者的receive()方法。

8行实现

8行实现与6行实现非常相似,但它增加了对质量服务(QoS)的支持。QoS允许订阅者指定他们希望接收的消息的质量级别。

class Publisher:
    def __init__(self):
        self.subscribers = {}

    def publish(self, topic, message, qos):
        for subscriber in self.subscribers.get(topic, []):
            if subscriber.qos >= qos:
                subscriber.receive(message)

class Subscriber:
    def __init__(self, publisher):
        self.publisher = publisher
        self.topics = []
        self.qos = 1

    def subscribe(self, topic, qos):
        self.topics.append(topic)
        self.publisher.subscribers.setdefault(topic, []).append(self)
        self.qos = qos

    def receive(self, message):
        print(message)

# 创建发布者和订阅者
publisher = Publisher()
subscriber1 = Subscriber(publisher)
subscriber2 = Subscriber(publisher)

# 订阅者1订阅主题"topic1",并设置QoS为2
subscriber1.subscribe("topic1", 2)

# 订阅者2订阅主题"topic2",并设置QoS为1
subscriber2.subscribe("topic2", 1)

# 发布消息
publisher.publish("topic1", "Hello, world!", 2)
publisher.publish("topic2", "Good morning!", 1)

在这个实现中,Subscriber类包含一个qos属性,其中存储了订阅者希望接收的消息的质量级别。当发布者调用publish()方法时,它会查找指定主题的订阅者列表,并只调用那些qos属性大于或等于指定质量级别的订阅者的receive()方法。

精简实现背后的玄机

发布订阅模式的精简实现背后的玄机在于,它们使用了非常简单的设计模式和数据结构。例如,3行实现只使用了最简单的列表来存储订阅者。随着实现变得更加复杂,它们使用的数据结构也变得更加复杂,但它们仍然保持了非常简单和易于理解的设计。

精简实现与标准发布订阅模式的区别

精简实现与标准发布订阅模式的区别在于,它们没有实现所有标准发布订阅模式的功能。例如,精简实现通常不支持主题层次结构、持久性消息传递或安全。然而,精简实现通常更简单、更易于理解和实现。

结论

发布订阅模式是一种非常灵活和可扩展的消息传递模式。它可以用于构建各种各样的应用程序,包括聊天应用程序、社交媒体应用程序和物联网应用程序。精简实现可以帮助您快速入门发布订阅模式,并了解其基本原理。