Я недавно использовал реальный мир для шаблона стратегии. Я нахожусь с синдромом молота/ногтя, где этот образец - мой молот, а все остальное - гвоздь. Для ударов я решил попробовать FizzBuzz с помощью шаблона стратегии. Теперь я знаю, что это полное убийство. Я видел различные реализации Enterprise, но это моя собственная реализация.Является ли это правильной реализацией шаблона стратегии с помощью упражнения FizzBuzz?
К моему удивлению и восхищению, это упражнение вызвало интересный вопрос: существует ли стандартный или другой шаблон, который работает в сочетании со стратегиями, которые помогут вам выбрать, какой из них использовать? В моем классе FizzBuzzStrategySelector ниже я поместил эту логику в функцию 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";;
}
}
Ну, вот как это закодировано. В настоящее время определенная стратегия задается в классе FizzBuzzStrategySelector. – jason
, то пример путает проблему стратегии с заводскими и регистрационными шаблонами –
Спасибо! Тогда я посмотрю на них и попытаюсь разобраться. – jason