实现观察者模式而不取消订阅方法



当我之前实现观察者模式时,我总是习惯在侦听器内部保存对所有者的引用。在听众的 ctor 中,我使用了注册,在 dtor 中我使用了注销。

但是这一次,我不想为在此类之间保持弱耦合提供参考。

我想出了一个带有弱ptr的实现。 我的问题是,是否可以在没有使用弱ptr取消订阅方法的情况下实现观察者模式?有什么情况会给我带来麻烦吗?

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

但是,您的实现存在数据竞争,其中elem在循环期间过期,您可能希望改为

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

最新更新