Недавно у меня было реальное использование шаблона Strategy. У меня синдром молотка/гвоздя, когда этот узор — мой молоток, а все остальное — гвоздь. Ради интереса я решил попробовать реализовать FizzBuzz с помощью шаблона стратегии. Теперь я знаю, что это полное убийство. Я видел различные реализации Enterprise, но это моя собственная реализация.
К моему удивлению и радости, это упражнение выявило интересный вопрос: существует ли стандарт или другой шаблон, который работает в сочетании со стратегиями, чтобы помочь вам выбрать, какую из них использовать? В моем классе FizzBuzzStrategySelector ниже я поместил эту логику в функцию Format.
Очевидно, что эта реализация непрактична... но это могло бы быть, если бы эти методы Format действительно имели некоторую логику реального мира, которую можно было бы сломать.
Мой основной вопрос здесь таков: правильно ли я использую здесь паттерн «Стратегия»?
class Program
{
static void Main(string[] args)
{
FizzBuzzStrategySelector fizzBuzzFormatter = new FizzBuzzStrategySelector();
for (int i = 1; i < 100; i++)
{
fizzBuzzFormatter.Format(i);
}
Console.ReadLine();
}
}
public interface IOutputFormatter
{
string FormatOutput(int value);
}
public class FizzBuzzStrategySelector
{
public IOutputFormatter formatStrategy;
public FizzBuzzStrategySelector() : this(new GeneralFormatter()) { }
public FizzBuzzStrategySelector(IOutputFormatter fizzBuzzFormatStrategy)
{
this.formatStrategy = fizzBuzzFormatStrategy;
}
public void Format(int value)
{
//THIS SEEMS LIKE A CODE SMELL. NOT SURE HOW TO WORK
//AROUND IT.
if(value % 15 == 0)
this.formatStrategy = new FizzBuzzFormatter();
else if(value % 3 == 0 )
this.formatStrategy = new FizzFormatter();
else if(value % 5 == 0)
this.formatStrategy = new BuzzFormatter();
else
this.formatStrategy = new GeneralFormatter();
Console.WriteLine(this.formatStrategy.FormatOutput(value));
}
}
public class GeneralFormatter : IOutputFormatter
{
public string FormatOutput(int value)
{
return value.ToString();
}
}
public class FizzBuzzFormatter : IOutputFormatter
{
public string FormatOutput(int value)
{
return "FizzBuzz";
}
}
public class BuzzFormatter : IOutputFormatter
{
public string FormatOutput(int value)
{
return "Buzz";
}
}
public class FizzFormatter : IOutputFormatter
{
public string FormatOutput(int value)
{
return "Fizz";;
}
}