关于回调函数设计的困惑

时间:2010-11-30 20:35:00

标签: c++ message-queue listener

我正在设计一个用于拦截和处理来自消息队列的传入消息的库。图书馆用户将为收到的不同类型的消息编写自己的消息处理函数。

我有一个MessageConsumer类需要处理不同类型的消息。我将所有处理函数组合到一个名为MessageHandlerBase的抽象基类中。库用户将继承此并编写自己的MessageHandler类。

MessageConsumer定义的相关部分:

class MessageConsumer {
protected:
    const MessageHandlerBase* m_mesgHandler;        
public:
    MessageConsumer( const std::string& brokerURI, 
                     const std::string& inputQueueName, 
                     const MessageHandlerBase* messageHandler);
    virtual ~MessageConsumer() { this->cleanup(); }
    void runConsumer();

    virtual void onMessage( const Message& message )
    {
         // code to receive and parse messages ...  

        if ( message is of type 1 ) {
            m_mesgHandler->handle_message_type_1(message);
        else if ( message is of type 2 ) {
            m_mesgHandler->handle_message_type_2(message);
         // ... and so on for different types of messages
    }
};

MessageHandlerBase定义是

class MessageHandlerBase {
    public:
        virtual void handle_message_type_1( const Message& ) const =0;
        virtual void handle_message_type_2( const Message& ) const =0;
        virtual void handle_cms_exception() const {}
        virtual void handle_transfer_interrupted() const {}
        virtual void handle_transfer_resumed() const {}
};

用户通常只关心处理1型和1型消息。 2所以我只是做了那些纯粹的虚拟。

我的主要问题是:在实施自己的MessageHandler类的handle_message_type_1handle_message_type_2方法时,用户需要从一个方法(或更多方法)访问方法他们的帮助班。如何将这些类提供给MessageHandler,而不将它们全局化?我可以将类作为void*参数传递给handle_message_type_1,但我不想因为(i)如果我需要传递多个函数并且(ii)那么我需要更改致电MessageConsumer;我想从MessageConsumer完全抽象出这些消息处理细节。

是否有更优雅的方式处理这整件事?

1 个答案:

答案 0 :(得分:2)

  

如何将这些类提供给MessageHandler,而不将它们设为全局?

用户需要从您的班级派生。什么阻止他们将各种数据成员放入他们的派生中,引用他们需要的东西?

这是使用仿函数而不是函数指针的主要优点:它使void* userData过时了。

相关问题