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