我不知道是否有我需要的特殊关键字。我正在写一个基本的观察者模式,我担心一些问题。我的实现是经典的。我正在使用一个 std::set 观察者,每当我需要触发一个事件时,我都会遍历这个集合并调用每个观察者的 notify 方法。我的问题如下。在以下情况下,当可观察对象向观察者发送事件时会发生什么:
- 一个观察者想要在事件期间从观察者集中移除自己(或任何其他观察者)?
- 一位观察者想要清除观察者集(移除所有观察者)?
- 一个观察者破坏了可观察的对象?
我知道所有这些情况最终都会发生。我对第三个有想法,但这是题外话。对于第一种和第二种情况,问题在于删除或清除 std::set 将使我用来枚举可观察对象的迭代器无效。即使没有,observable 也不应该通知任何在事件处理期间将被删除的观察者。
我还没有找到一个 set 的实现,它提供了一个能够在删除任何项目时保持有效的迭代器。不过,有可能实现它,但代价是一些间接并在容器中存储对活动迭代器的任何引用,以便在必要时对其进行更新。
另一种解决方案是复制观察者集合,迭代副本并检查当前迭代的观察者是否仍在真实集合中。(这会忘记在活动期间添加的任何新观察者,但这种情况我不在乎)
您对此问题有任何建议/解决方案吗?