深入探讨发布订阅模式的精简实现,从8行到3行,揭秘精简背后的玄机
2023-11-17 15:33:14
发布订阅模式简介
发布订阅模式是一种消息传递模式,允许发布者将消息发布到频道,而订阅者可以订阅该频道以接收消息。发布者和订阅者之间没有直接的耦合,这使得发布订阅模式非常灵活和可扩展。
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行实现只使用了最简单的列表来存储订阅者。随着实现变得更加复杂,它们使用的数据结构也变得更加复杂,但它们仍然保持了非常简单和易于理解的设计。
精简实现与标准发布订阅模式的区别
精简实现与标准发布订阅模式的区别在于,它们没有实现所有标准发布订阅模式的功能。例如,精简实现通常不支持主题层次结构、持久性消息传递或安全。然而,精简实现通常更简单、更易于理解和实现。
结论
发布订阅模式是一种非常灵活和可扩展的消息传递模式。它可以用于构建各种各样的应用程序,包括聊天应用程序、社交媒体应用程序和物联网应用程序。精简实现可以帮助您快速入门发布订阅模式,并了解其基本原理。