必要なものに特別なキーワードがあるかどうかわかりません。私は基本的な観察パターンを書いていますが、いくつかの問題が心配です。私の実装は古典的です。私はオブザーバーの std::set を使用しています。イベントを発生させる必要があるときはいつでも、このセットを繰り返し処理し、各オブザーバーの通知メソッドを呼び出します。私の問題は次のとおりです。次の場合、監視可能なオブジェクトがオブザーバーにイベントを送信するとどうなりますか。
- あるオブザーバーが、イベント中に設定されたオブザーバーから自分自身 (または他のオブザーバー) を削除したいですか?
- 1 人のオブザーバーがオブザーバー セットをクリアしたい (すべてのオブザーバーを削除する) ?
- 1人のオブザーバーがオブザーバブルオブジェクトを破壊しますか?
私は、これらすべてのケースが最終的に起こることを知っています。3 つ目のアイデアはありますが、これはトピック外です。最初と 2 番目のケースの問題は、std::set を削除またはクリアすると、オブザーバブルを列挙するために使用しているイテレータが無効になることです。そうでない場合でも、オブザーバブルは、イベント処理中に削除されたオブザーバーに通知するべきではありません。
アイテムが削除されたときに有効な状態を維持できるイテレータを提供するセットの実装はまだ見つかりませんでした。ただし、必要に応じて更新するために、間接的であり、コンテナに生きているイテレータへの参照を格納するという犠牲を払って、それを実装することは可能です。
別の解決策は、オブザーバーのセットをコピーし、コピーを反復して、現在反復されているオブザーバーがまだ真のセットにあるかどうかを確認することです。(これにより、イベント中に追加された新しいオブザーバーがすべて忘れられますが、この場合は気にしません)
この問題に関する提案/解決策はありますか?