哪个更好:函数覆盖或传递函数指针以进行事件处理

rec*_*ion 4 c++ message-queue listener

所以,我正在编写一个类的代码,这个类将进入一个将被其他人使用的库.该类将拦截并处理传入的消息(详细信息并不重要,但它使用的是activemq-cpp库).这个消费者类的概要是

class MessageConsumer {
    ...
    public:
        void runConsumer();
        virtual void onMessage(const Message* message);
}
Run Code Online (Sandbox Code Playgroud)

其中,runConsumer()建立连接并开始监听和onMessage()接收消息时被调用.

我的问题是:使用此代码的人将各自拥有处理不同消息的方式.如何保持MessageConsumer通用但提供这种灵活性,同时保持代码简单?

两种选择:

  • 他们应该继承MessageConsumer自己的新课onMessage()吗?
  • 他们应该将指针传递给消息处理函数MessageConsumer吗?

您怎么看?哪个选项更好,为什么?

谢谢!

Chu*_*dad 6

在一种方法中,允许客户端注册回调,然后MessageConsumer调用注册的回调.这类似于观察者/广播设计模式.

客户端必须继承并覆盖MessageConsumer的第二种方法类似于策略设计模式.

基本设计目标建议使用最弱的关系来促进松耦合.由于与简单关联相比,无关是一种更强的关系,所以其他所有方法都是相同的方法1.

来自赫伯的文章

"继承经常被过度使用,即使是经验丰富的开发人员.总是最小化耦合:如果类关系可以用多种方式表达,那么使用最实际的最弱关系.鉴于继承几乎是你用C++表达的最强关系(第二)只有友谊),只有在没有相同的弱势选择的情况下才真正合适."

但正如詹姆斯指出的那样,除非明确了解整体设计限制,否则很难发表评论.

  • @Basilevs:继承是友谊之后最强的关系.考虑修改基类的所有后果. (3认同)