3

このパターンを初めて使用し、C#を使用しています。

これが正しい実装であることを確認したかっただけです。
Winformにボタンがあり、クリックすると、ドロップダウンボックスから選択して定義された特定の形式でデータが出力されます。これは将来変更される可能性があるため、戦略パターンを使用して変更内容をカプセル化します。

「DisplayData()」という単一のメソッドを公開するだけの「ストラテジーインターフェイス」があります。

ボタンをクリックすると、次のコードを使用します。

private void ConfirmButton_Click(object sender, EventArgs e)
    {
        IViewData viewData;

        switch (outputMedia)
        {
            case "Excel":
                viewData = new ExcelOutput(operation, study);
                viewData.DisplayData();
                break;
            case "Spotfire":
                viewData = new SpotfireOutput(operation, study);
                viewData.DisplayData();
                break;
        }


    }

これは、このパターンを使用するための許容可能な方法ですか?明らかに、追加の出力メディアが識別された場合は、新しいサブクラスを作成し、switchステートメントに追加の「case」を追加します。

ありがとう。

4

3 に答える 3

4

ストラテジーを使用する適切な方法は、IViewDataオブジェクトの作成とその使用を分離することです。作成自体はファクトリメソッドによって処理される場合があります。IViewData次に、オブジェクトの具象クラスをまったく認識しない別の場所で作成されたものを使用できます。

例えば

private IViewData CreateViewData()
{
    IViewData viewData;

    switch (outputMedia)
    {
        case "Excel":
            viewData = new ExcelOutput(operation, study);
            break;
        case "Spotfire":
            viewData = new SpotfireOutput(operation, study);
            break;
    }
    return viewData;
}

...

private void ConfirmButton_Click(object sender, EventArgs e)
{
    IViewData viewData = CreateViewData();

    viewData.DisplayData();
}

これから、ファクトリメソッドをリファクタリングすることでソリューションをさらに改善できます。Dictionaryの代わりにを使用するswitchか、ビューデータオブジェクトを1回だけ作成してキャッシュするか、(提案したように)依存性注入に置き換えることを決定できます...

于 2011-02-14T12:50:28.573 に答える
2

まずviewData.DisplayData();、スイッチから移動できます。ケースごとに繰り返す必要はありません。そして、それらすべてに対して同じ方法で呼び出すことができるということDisplayDataは、最初にそのインターフェースを導入したすべてのポイントです。

すべてで同じ方法でパラメータを渡すことcaseも、少し繰り返しに見えます。したがって、Dictionary<string,Func<Operation,Study,IViewData>>代わりに使用してください。しかし、異なるクラスが異なるコンストラクターを必要とする場合、これは機能しません。

于 2011-02-14T12:51:51.447 に答える
1

switchステートメントを独自のメソッドに移動する必要があります。理想的には一部のコントローラークラスに移動する必要があります。これは、IViewDataオブジェクトが必要になったときに、スイッチコードを書き直す必要がないことを意味します。

private void ConfirmButton_Click(object sender, EventArgs e)
{
    IViewData viewData = ViewDataController.GetViewDataController(outputMedia, operation, study);

   viewData.DisplayData();

}

そして、あなたのコントローラーで:

 public class ViewDataController
 {
    public static IViewData GetViewDataController(string outputMedia, string operation, string study)
    {
      IViewData viewData = null;

      switch (outputMedia)
      {
        case "Excel":
            viewData = new ExcelOutput(operation, study);
            break;
        case "Spotfire":
            viewData = new SpotfireOutput(operation, study);
            break;
      }
      return viewData;
     }

これにより、アプリケーション全体で同じコードを再利用できるようになります。switchステートメントにエントリを追加する必要がある場合は、1か所で追加するだけで済みます。

于 2011-02-14T13:00:44.193 に答える