2

コマンド パターンについての私の理解では、仮想メソッド 'execute()' が 1 つだけあり、実装が持つ可能性のあるすべての依存関係は、コンストラクターに配置されるか、実装のセッター インジェクションによって配置されます (ここで説明したように)。

ただし、パターンの WPF 実装では、一般的な引数を execute() 関数 (ここで説明) に渡していることに気付きました。

これはインターフェイスの汚染のように思えますが、execute() 関数に汎用パラメーターを追加する動機は何でしたか?

4

5 に答える 5

3

正規のコマンド パターンは通常、優れた自己完結型のコマンドで示されます。コマンドが必要とする情報は、Command オブジェクト インスタンス内に隠されています (通常は、パラメーター化されたコンストラクターを介して)。

ただし、場合によっては、Execute に必要なパラメーターがコマンド作成時に使用できないことがあります (実行時にのみ認識されます)。たとえば、想像してみてくださいSignOutCommand( username )。ユーザー名は、ユーザーが最初にサインインした後に [サインアウト] ボタンをクリックしたときに決定されます。

したがって、ユーザー名はジェネリック パラメータとして に渡されますCommand.Execute()。各コマンドは、その入力を自由に定義し、それに応じてキャストできます。たとえば、任意のコマンドは、オブジェクト [] として 5 つのパラメーターを必要とすることができます。

于 2010-01-29T10:30:03.433 に答える
1

データバインディング用です。たとえば、コマンドをリスト内のすべてのオブジェクトにバインドすると、現在のインスタンスが execute メソッドに送信されるため、現在のインスタンスを自分で追跡する必要はありません。

そうは言っても、WPF コマンドの概念はコマンド パターンの実装ではないと思います。用語を共有しているだけです。

于 2010-01-29T10:05:12.007 に答える
1

このパラメーターの背後にある理由は、コマンドの作成者(実行する必要があるコマンドを知っている) と、コマンドをいつ実行する必要があるかを知っている呼び出し元との分離です

特定のコマンドでは、実行に必要な情報の一部を作成者が利用できません。呼び出し元は、実行するパラメーターを渡して空白を埋めます。例: 作成者は、いくつかの基準に従ってレコードのリストをフィルタリングするコマンドを作成します。アプリにはたくさんの種類のリストがあるため、リストは作成サイトでは利用できません。

呼び出し元は、パラメーターとして at を渡すことによって、フィルター処理する必要があるリストを指定します。

于 2010-01-29T10:06:01.603 に答える
1

少し変更されたコマンド パターンを使用するため、Execute メソッドに加えて、Request と Response の 2 つのプロパティがあり、ポリモーフィズムを使用してそれらをパラメータ化します。

于 2010-01-29T10:06:36.577 に答える
1

どうしたの:

public class DeleteCommand : BaseCommand
{
  private Dictionary<string, object> parameters;

  public DeleteCommand(Dictionary<string, object> parameters)
  {
     this.parameters = parameters;
  }

  public void Execute()
  {
     var person = (Person)parameters["Person"];
     var salary = System.Convert.ToDouble(parameters["Salary"]);

     // etc.
  }
}

パラメータを収集するコントローラーがある場合は、それらをコマンドに渡すことができます。

于 2010-01-31T18:36:55.600 に答える