4

次の一般的なプログラム構造を検討してください。

  • クラスAには、メンバー変数としてクラスBのインスタンスがあります
  • クラスBには、クラスCのインスタンスを含むコレクションメンバー変数があります
  • クラスAのイベントは、AがBにイベントについて通知するだけでCインスタンスに伝播されます。

クラスCがクラスAに話しかけるインスタンスに関するデザインパターンは何ですか?

1つのオプションは、クラスAがサブスクライブするクラスC投稿通知のインスタンスです。別のオプションは、クラスAへの参照を「チェーンの下流」に渡すことです(AからBに、次にBから各Cに)。この後者のオプションを使用すると、CのインスタンスがAと直接通信できます。

4

1 に答える 1

3

文字通り(つまり、GoFの種類の)デザインパターンを意味する場合、これらはいくつかの関連するオプションになります。

  • コマンド:Cアイテムにコールバックを(Bを介して直接または間接的に)渡します。これにより、アイテムに話しかけたいときに、Aこのコールバックを呼び出すことができます。これにはパラメーターを含めることもできます。
  • イテレータ:B集約コレクションのビューを直接A;に公開します。Aとの間の通信Cは直接行われます
  • メディエーター:サブスクライブする可能性のある通知を公開しますACコミュニケーションはイベントを投稿することによって行われます
  • オブザーバー:最初のオプションとしてすでに提案したこと

一方、本当にアーキテクチャパターンを意味する場合、一般的なオプションは次のとおりです。

  • イベントをA購読する最初のオプション。C一見すると、イベントが常に非常に役立つ場合を除いて、これは万能の良いアイデアのようには見えません。nオブジェクトがコールバックへのポインタを集約する必要があり、最悪の場合、一度だけ使用することもできるからです。
  • への参照を渡すことは別のオプションですが、非常に特定のシナリオでコールバックできるようにするためだけに、メソッドを使用しAてのパブリックインターフェイスを汚染する場合は適切ではありません。すでに適切なインターフェイスを公開している場合は非常に効果的ですが、のインターフェイスに緊密に結合しないようにするために、コールバックの間にアダプタクラスが必要になる場合があることに注意してください。ACACACA
  • 3番目のオプションは、直接A提供されたコレクション(のビュー)を反復処理し、インスタンスにコールバックを提供することです。これには、結合が非常に緩く、メモリの使用量が最も少ないという利点がありますが、コーディングが少し難しい場合があります。BC
于 2012-04-15T02:07:58.220 に答える