私はこのパターンを "スマートビルディング"システム設計(STLライブラリを使用)で実装しようとしています。部屋、床などに配置された様々な「センサー」、「コントローラ」(異なる部屋、床などに配置される)によって処理される信号を送出する。私が直面している問題は、イベントへのコントローラのサブスクリプションはイベントベースではなく、ロケーションベースでもあるということです。C++オブザーバパターン:別の次元を追加する
たとえば、コントローラAは、フロア#4の部屋#1からフロア#5のモーション信号に加入できます。フロアベースのサブスクリプションとは、コントローラAが購読しているフロア内のすべての部屋について、適切なセンサが配置されていると仮定して、モーションイベントを取得することを意味します。そのことについては、建物全体での契約もあります。
システムのトポロジは、起動時に構成ファイルから読み込まれるため、建物全体をマップする必要はなく、センサとコントローラを含む関連する場所だけにマップします。
オプション1:地域の名前(Building1、フロア2、ルーム3)とベクトルのインデックスが列挙され、ベクターを含み MonitoredAreaクラスを私は考えることができた何
イベント・タイプベクトルの各メンバーには、このイベントにサブスクライブしているコントローラーのリストが入っています。クラスには親のMonitoredAreaへのポインタも含まれます(フロア内の部屋、建物内のフロアの場合)。
センサークラスはセンサーの名前と共にイベントをセンターハブにディスパッチします。ハブは、センサー名から位置へのマップを介してハブを実行し、一致するMonitoredAreaを取得し、ベクトル内のすべてのコントローラーに警告します。短所
:
オプション2: コントローラクラス内のすべてのサブスクリプションを維持します。短所
:
- 非常に効率が悪いです。すべてのイベントは、コントロールセンターがすべてのコントローラを反復して、この特定のイベントに登録されているコントローラを見つけるようにします。
オプション3: イベントベースの機能。イベントクラス(すなわち、FireEvent)には、(センサーの設定に従って)起こり得るすべての場所と、すべての場所について、その場所に登録されているコントローラのリストが含まれます。短所
:
- マップのマップ
- 強力なデータ重複
- 様々なお部屋でのイベントについて、床ベースのサブスクリプションを警告する方法はありません。
ご覧のとおり、上記の解決策に満足できません。私は、考え過ぎた段階に達したと確信しており、私がこれにどのようにアプローチするかについてのフィードバックや代替提案に満足しています。ありがとう。
感謝の質問:どのようにメッセージバスは単純なイベントと異なっていますループ? – susdu
あなたの質問を正しく理解しているかどうか分かりませんが、これは型指定された言語のメソッドディスパッチを実装する別の方法です。別のクラスがその特定のIDに興味がある場合(これについてはいくつかの実装があります)、iを処理できますt。通常のメソッド呼び出しメッセージのディスパッチと同じように、オブジェクト間で直接関数呼び出しはありません。 – tritron