戦略パターンが実際に何であるかについて誰かとオタクの戦いがあり、問題を解決するには専門家が必要です.
同じインターフェースを維持しながら、実行時にクラスの中身 (動作など) を交換できるストラテジー パターンについては、両者とも同意しています。しかし、彼女の主張は、「[アルゴリズム] が戦略であるためには、同じ結果が得られなければならない」というものです。私の主張は、クラスの「アルゴリズム」またはロジックを交換すると、オーバーライドされた操作の結果が異なることを意味する可能性がありますが、それでも戦略パターンの目的、意図 (および分類) を満たしているということです。
コメント付きの彼女のコード例:
あなたの定義によれば、クラスのサブクラスは戦略になります。これらは同じメソッド定義 (シグネチャ) を持っているため、交換可能です。
Interface Strategy
{
DoArithmatic(int[] a)
}
Class A : Strategy
public int DoArithmatic(int[]a)
{
int temp = 0;
for(int i =0; i< a.length; i++)
temp += a[i]
}
Class B : Strategy
public int DoArithmaticB(int[]a)
{
int temp = 0;
for(int i =a.length -1; i>-1; i--)
temp += a[i]
}
Class C : Strategy
public int DoArithmatic(int[]a)
{
int temp = 0;
for(int i =0; i< a.length; i++)
temp -= a;
}
int[] a = { 1,2,3 }
ClassA.DoArithmatic(a) = 6
ClassB.DoArithmatic(a) = 6
ClassC.DoArithmatic(a) = -6//This one is not interchangeable
最初の 2 つは戦略です。どんな入力に対しても、彼らはあなたに正確に同じ答えを与えるからです。最後のものはそうではありません。int が得られるからといって、それが戦略になるわけではありません。彼らは同じことを「行う」必要があります。
それらを戦略にするためだけに「より高い」抽象化用語を使用することはできません。
これらはすべて「数学」を行いますが、すべて「同じ」ことを異なる方法で行っているわけではありません。それが戦略の本質です。
それで、誰が正しいですか?