戦略パターンの実装例を見てきましたが、C# デリゲートに非常に似ているように思えます。唯一の違いは、戦略パターンの実装ではデリゲートを明示的に宣言する必要がないことです。
しかし、それ以外は、どちらも特定の署名を必要とする関数を指しているように見え、実行時に何を実行するかを決定するために使用できます。
私が見逃しているより明白な違いはありますか?
関連する質問は、それらが似ている場合、一方を他方よりも使用する利点は何ですか?
戦略パターンの実装例を見てきましたが、C# デリゲートに非常に似ているように思えます。唯一の違いは、戦略パターンの実装ではデリゲートを明示的に宣言する必要がないことです。
しかし、それ以外は、どちらも特定の署名を必要とする関数を指しているように見え、実行時に何を実行するかを決定するために使用できます。
私が見逃しているより明白な違いはありますか?
関連する質問は、それらが似ている場合、一方を他方よりも使用する利点は何ですか?
簡単に言えば、デリゲートを使用して戦略パターンを実装できます。
作戦パターンはパターンです。デリゲートは言語機能です。言語機能を使用してパターンを実装します。それらは完全に 2 つの異なる概念のカテゴリに属しますが、相互の相互作用において関連しています。
つまり、戦略パターンは設計図であり、C# デリゲートはレンガです。どちらかがなければ、(戦略パターン) 家を建てることはできません。(他の種類のブリックで構築することもできますが、デリゲートの言語機能には本質的に戦略パターンを記述するものはありません)。
デザイン パターンは、一般的に遭遇する問題に対する、言語にとらわれない高度なソリューションです。
デリゲートは、.NET の戦略パターンのプラットフォーム固有の実装で使用できますが、そのようなソリューションを実装する唯一の方法ではありません。
別の解決策は、次のようなインターフェースを定義することです。
public interface IStrategy
{
void DoStuff(...)
}
戦略は、デリゲートではなく、このインターフェイスを実装するクラスによって表されます。
戦略が非常に単純であると予想される場合、デリゲートは問題ない実装かもしれません。かなり複雑なものについては、戦略をインターフェースとして実装すると、状態の追跡、複数のメソッドへの編成、実装間でのコードの共有などに関して、より多くのオプションが提供されます。
他にどのように C# で戦略パターンを実装しますか?
パターンはアーキテクチャの問題です。デリゲートは実装の問題です。
C# では、ほとんどの場合、戦略パターンはデリゲートを使用して実装されます。
戦略パターンは、実行時に個別の関数を選択できる設計パターンであり、デリゲートは、関数への参照を作成して変数として使用できる言語構造です。
戦略パターンは、ポリモーフィック ディスパッチがよりエレガントになる傾向があるため、デリゲートよりもポリモーフィズムを使用して実装する方が適切です。