python消息传递系统中的右继承结构(可以使用桥模式)

2024-10-03 19:29:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试开发一些消息传递系统,它可以同时使用ZeroMQ和RabbitMQ(可能更像activeMQ)。你知道吗

所以我这样想:

我的消息传递系统中的组件可以是发送方或接收方。他们两个都有地址,所以我需要概括一下。因此,我创建了它—AbstractMessagingNode,其中包含两个更精确的抽象:AbstractReceiver和AbstractSender。你知道吗

class AbstractMessagingNode():
    __metaclass__ = ABCMeta

    def __init__(self, host):
        self.host = host

class AbstractReceiver(AbstractMessagingNode):
    __metaclass__ = ABCMeta
    callback = None
    host = None
    def __init__(self, host, on_receive_callback):
        super(AbstractReceiver, self).__init__(host)
        self.callback = on_receive_callback

    def on_message_received(self, *args):
        self.callback(*args)

class AbstractSender(AbstractMessagingNode):
    __metaclass__ = ABCMeta

    @abstractmethod
    def send_message(self, message):
        pass

一开始我只和兔子一起工作。因此,我为此创建了两个更精确的抽象(基本上把它们看作具体的实现)

class BaseRabbitSender(AbstractSender):
    __metaclass__ = ABCMeta
    default_port_number = 5672

    def __init__(self, host):
        super(BaseRabbitSender, self).__init__(host)
        self.connection = pika.BlockingConnection(pika.ConnectionParameters(
            host=host))
        self.channel = self.connection.channel()

    @abstractmethod
    def send_message(self, message):
        pass

    def close_connection(self):
        self.connection.close()

等等。。。你知道吗

这一切都很顺利,直到我试着把zmq放进去。你知道吗

问题是zmqnode也可以是发送方或接收方(在我的例子中)。但是接收方和发送方都需要通用的方法和字段。我试着用这门课来捕捉

class AbstractZmqNode(AbstractMessagingNode):
    __metaclass__ = ABCMeta

    def __init__(self, host, port):
        super(AbstractZmqNode, self).__init__(host)
        self.port = port
        self.context = zmq.Context()

   def set_hwm(self, hwm):
        self.socket.set_hwm(hwm)

    @staticmethod
    def build_address(host, port):
        strings = [host, ':', str(port)]
        return ''.join(strings)

但这就产生了代码重复的问题,因为在这种情况下,我还需要AbstractZmqSender和AbstractZmqReceiver,这是不好的。你知道吗

我在考虑桥接模式,但不知道从哪里开始,因为在所有桥接模式的示例中,抽象只是一个接口,但在我的例子中,它有一些数据字段。你知道吗

我愿意接受你的帮助和建议。你知道吗


Tags: selfhostmessageinitportdefcallbackconnection