1

フォーカスされたコントロール (イベントを発生させたコントロールではなく) に作用するイベントが発生した場合、Model-GUI-Mediator (MGM) パターンでこれをどのように処理しますか? 複数のモデルがある場合、この質問は密接に関連するMVP パターンにも当てはまると思います。

この「イベントの委任」というタイトルを付けたのは、イベントを発生させたコントロールのメディエーターが、選択されたコントロール (またはそのモデル) のメディエーターにイベントを委任する必要があると思うからです。

バックグラウンド

MGM パターンはMVP Passive Viewに少し似ていますが、フォームごとに 1 つのプレゼンターではなく、コントロールごとに個別の「メディエーター」がある点が異なります。コントロールのイベントはすべてそのメディエーターによって処理され、メディエーターは応答として特定のモデルのメソッドを呼び出します。メディエーターはモデルのオブザーバーであり、モデルが変更されるとその制御を更新します。これは、コントロールにデータ バインディングがなく、コントロールをサブクラス化したくない RAD 環境に特に適しています。また、パッシブ ビューとは異なり、イベントを接続する定型コードがほとんどないという利点もあります。以下に、2 つの詳細な説明を示します。

問題の例

  1. フォームには、多数のモデル オブジェクトのビューを提供する多数のコントロールが含まれています。一度に選択できるビューは 1 つだけです。(具体的なものが必要な場合は、マルチドキュメント エディターを想像してください。)

  2. ユーザーがメニューからコマンドを呼び出します。これにより、特定のメニュー項目のメディエーター オブジェクトで Execute メソッドが呼び出されます。(メニュー項目はコントロールなので、対応するメディエーターがあります。)

  3. このコマンドは、現在選択されているコントロールに対してアクションを実行することになっています。

  4. したがって、メニュー項目のメディエーターは、選択されたコントロールに属するメディエーターを見つけてそこにアクションを委譲するか、選択されたコントロールのメディエーターに関連付けられたモデルを見つけて直接呼び出す必要があります。

しかし、メニュー項目のメディエーターは、選択されたコントロールのメディエーターをどのように見つけるのでしょうか?

MGM では、メディエーター オブジェクトは自己完結型であると想定されているため、他のメディエーター オブジェクトについてはわかりません。コントロールは、モデルについて何も知ることができません (関心の明確な分離を維持するため)。コントロールがメディエーターについて知っているのは、イベント ハンドラーだけです。

ハッキーな回避策

これまでのところ、選択したコントロールのイベント フィールドを調べるのが最善の方法です。これは、そのコントロールのメディエーターへのオブジェクト メソッド ポインターになります。Delphi では、これを TMethod にキャストできるため、コントロールのメディエータのオブジェクト ポインタを抽出できます。次に、これをメディエーターの型にキャストして、必要なメソッドを呼び出すことができます。

しかし、これは言語機能 (TMethod) に大きく依存しているようで、メディエーター クラス間の依存関係も作成します。

おそらく、私は完全に間違った方向に進んでいるのでしょう…</p>

(PS 私よりも多くの担当者がいる人は、「model-gui-mediator」タグを作成してもらえますか? ありがとう。)

4

1 に答える 1