我正在设计一个库,该库将用于拦截和处理来自消息队列的传入消息。图书馆用户将针对收到的各种消息编写自己的消息处理功能。

我有一个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和2的消息,因此我只是将它们做成纯虚拟的。

我的大问题是:在实现自己的MessageHandler类的handle_message_type_1handle_message_type_2方法时,用户需要从一个(或可能更多)帮助器类中访问方法。如何使这些类可用于MessageHandler而不使它们成为全局类?我可以将类作为void*参数传递给handle_message_type_1,但我不想这样做,因为(i)如果我需要传递多个函数,并且(ii)我需要更改MessageConsumer的调用,该怎么办?我想从MessageConsumer中完全提取这些消息处理细节。

有没有更优雅的方式来处理整个事情?

最佳答案



用户需要从您的类(class)中派生。是什么阻止他们将各种数据成员放入其派生对象,并引用他们所需的内容?

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

关于c++ - 关于回调函数设计的困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4318305/

10-11 21:13