其他分享
首页 > 其他分享> > C,函数指针与观察者模式

C,函数指针与观察者模式

作者:互联网

几年前,在我对C有很多了解之前,我正在与一位经验丰富的程序员同事讨论创建事件系统等问题.
他似乎强调需要传递函数指针,以便可以通过回调来通知类状态变化等.

但是,现在每当我需要实现某种事件系统时,我只需构造一个伪接口类,继承它并使用subscriber / observer模式来覆盖方法并分发事件.

前几天我在想,到目前为止,我很少需要使用函数指针,当然不是针对上述情况.我真正必须使用函数指针的唯一情况是与其他明确要求传递的.dll连接.

我什么时候应该使用函数指针而不是订阅者/观察者模式?

使用其中一种是好/坏的做法? (可能必须存在观察者模式不比函数指针好的情况).

请有人可以分享一些见解吗?在这方面获得更多经验会很好吗? (前面提到的同事已经转移到另一个企业,我们失去了联系).我一直在讨论这个问题,并且无法想到何时使用观察者模式和界面不合适.

谢谢!

我经常发现自己编写的一个类的例子(没有经过测试,完全脱离我的头脑,可能实际上不起作用):

class NotifierListener {

friend class Notifier;
private:
vector<NotifierListener*> mListeners;

protected:
void subscribe(NotifierListener* _subscriber) {mListeners->push_back(_subscriber);}
virtual void onNotification();
}

class Notifier : public NotifierListener {

private:
void doSomethingAndNotify() {

...
if (mListeners.size() > 0) {
for (int i = 0; i < mListeners.size(); ++i) {

mListeners[i]->onNotification();
}
}

}
}

class Something : public NotifierListener {

Something() { subscribe(this); }

void onNotification() {

cout << "I got notified\n" << endl;
}
}

解决方法:

函数指针效率更高一些.您现在将指针传递给接口.接口通常*包含指向vtable的指针.而vtable又包含函数指针.这是间接的3个级别,具有较差的参考局部性.

[*]其他实现是可能的,但具有类似的开销.

标签:c,function-pointers,observer-pattern
来源: https://codeday.me/bug/20190828/1754393.html