У меня была сумасшедшая схватка с кем-то из-за того, что на самом деле представляет собой шаблон стратегии, и мне нужен эксперт, чтобы решить этот вопрос.
Мы оба согласны с тем, что шаблон стратегии позволяет менять внутренности класса (например, поведение) во время выполнения при сохранении того же интерфейса. Тем не менее, она утверждает, что «для того, чтобы [алгоритмы] были стратегией, вы должны получить те же результаты». Я утверждаю, что замена «алгоритма» или логики класса может означать, что результаты переопределенной операции различны, но что она все еще соответствует цели, намерению (и классификации) шаблона стратегии.
Пример кода с комментариями:
По вашему определению, любой подкласс класса будет стратегией. Они имеют одинаковые определения методов (подписи) и поэтому являются взаимозаменяемыми.
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
Первые две являются стратегиями. Потому что за любой вклад они дадут вам ТОЧНЫЙ ответ. последний нет. То, что он дает вам int, не делает его стратегией. Они должны "сделать" то же самое.
Вы не можете использовать термин "более высокая" абстракция просто для того, чтобы сделать их стратегией.
Все они делают "МАТ", но не все делают "одно и то же" по-разному. В этом суть стратегии.
Итак, кто прав?