不使用取消订阅方法实现观察者模式
Implementing observer pattern without unsubscribe method
我以前实现观察者模式的时候,总是习惯在listener里面持有一个owner的引用。在 listener 的 ctor 中,我使用了 register,而在 dtor 中,我使用了 unregister。
但是这一次我不想持有一个参考来保持这个 类 之间的弱耦合。
我想出了一个 implementation with weak-ptr. 我的问题是,是否可以在不使用 weak-ptr 取消订阅方法的情况下实现观察者模式?
在任何情况下我都会遇到麻烦吗?
是的,对观察者使用 weak_ptr
很自然。
但是,您的实现存在数据竞争,其中 elem
在循环期间过期,您可能想要改为执行
for (auto elem : listenerList)
{
auto locked = elem.lock();
if (locked) { locked->update(val); }
else { anyExpired = true; }
}
我以前实现观察者模式的时候,总是习惯在listener里面持有一个owner的引用。在 listener 的 ctor 中,我使用了 register,而在 dtor 中,我使用了 unregister。
但是这一次我不想持有一个参考来保持这个 类 之间的弱耦合。
我想出了一个 implementation with weak-ptr. 我的问题是,是否可以在不使用 weak-ptr 取消订阅方法的情况下实现观察者模式? 在任何情况下我都会遇到麻烦吗?
是的,对观察者使用 weak_ptr
很自然。
但是,您的实现存在数据竞争,其中 elem
在循环期间过期,您可能想要改为执行
for (auto elem : listenerList)
{
auto locked = elem.lock();
if (locked) { locked->update(val); }
else { anyExpired = true; }
}