我正在设计一个用于拦截和处理来自消息队列的传入消息的库。图书馆用户将为收到的不同类型的消息编写自己的消息处理函数。
我有一个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_1
和handle_message_type_2
方法时,用户需要从一个方法(或更多方法)访问方法他们的帮助班。如何将这些类提供给MessageHandler
,而不将它们全局化?我可以将类作为void*
参数传递给handle_message_type_1
,但我不想因为(i)如果我需要传递多个函数并且(ii)那么我需要更改致电MessageConsumer
;我想从MessageConsumer
完全抽象出这些消息处理细节。
是否有更优雅的方式处理这整件事?
答案 0 :(得分:2)
如何将这些类提供给
MessageHandler
,而不将它们设为全局?
用户需要从您的班级派生。什么阻止他们将各种数据成员放入他们的派生中,引用他们需要的东西?
这是使用仿函数而不是函数指针的主要优点:它使void* userData
过时了。