在没有取消订阅方法的情况下实现观察者模式

时间:2017-06-09 10:28:59

标签: c++11 observer-pattern

当我之前实现观察者模式时,我总是习惯于在监听器内部拥有对所有者的引用。在听众的照片中,我使用了寄存器,而在dtor中,我曾经注销过。

但这一次我不想持有一个参考来保持这些类之间的弱耦合。

我想出一个implementation with weak-ptr. 我的问题是,如果没有unsubscribe方法和weak-ptr可以实现观察者模式吗? 有没有我可以遇到麻烦的情况?

1 个答案:

答案 0 :(得分:1)

是的,对观察者使用weak_ptr是很自然的选择。

但是,您的实现有一个数据竞争,其中elem在您的循环期间到期,您可能想要改为

for (auto elem : listenerList)
{
    auto locked = elem.lock();
    if (locked) { locked->update(val); }
    else { anyExpired = true; }
}