3

戦略パターンを実装しようとしています。これが私の実装の一部です:

public List<string> GetOrderedEmployeeNames(IOrderByStrategy strategy)
{
   return GetEmployeeFullNames().OrderBy(strategy.Order);
}

この関数を呼び出すたびに、次のように記述する必要があります。

var employees = GetOrderedEmployeeNames(new OrderByFamilyName());

毎回戦略を「新しくする」ことは正しい方法ですか、それとも間違って実装していますか?

4

3 に答える 3

7

実装するクラスにIOrderByStrategy状態がない場合(つまり、毎回同じように動作する場合)、再作成の手間を省くために、どこかのフィールドに格納することをお勧めしますnew

とは言うものの、newこれは非常に効率的な操作であり、タイトなループで呼び出していない場合は、実行していることを実行し続ける方が簡単な場合があります。

于 2012-07-05T18:55:28.267 に答える
3

必ずしもそうではありませんが、オブジェクトはほとんどがメソッドであり、多くのデータを保持していないと想定しているため、オブジェクトを作成してもおそらく何も問題はありません。

いくつかの代替案:

  • StrategyFactory新しいインスタンスを作成するか、flyweights (文字列などのキーによってインデックス付けされた小さなオブジェクト) への参照を保持する を実装します。
  • 戦略をシングルトンとして実装しますが、多くの戦略がある場合、必要以上のオーバーヘッドになる可能性があります。
于 2012-07-05T18:57:45.333 に答える
1

戦略が同じ動作をする場合は、プロパティを保存できます。そうでない場合は、パラメーターを使用してオブジェクトを作成できます。

    private IOrderByStrategy orderByStrategy;
    public IOrderByStrategy OrderByStrategy
    {
         get
         {
            if(orderByStrategy != null)
               return orderByStrategy;
            else
               return new OrderByStrategy();
         }
    }
var employees = GetOrderedEmployeeNames(OrderByStrategy);

2 番目の状況:

var employees = GetOrderedEmployeeNames(new OrderByFamilyName("familyname","DESC"));
于 2012-07-05T19:24:58.807 に答える