2013-03-22 4 views
1

Я недавно использовал реальный мир для шаблона стратегии. Я нахожусь с синдромом молота/ногтя, где этот образец - мой молот, а все остальное - гвоздь. Для ударов я решил попробовать 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";; 
    } 
} 

ответ

0

различные выходные данные являются частью шаблона стратегии. обычно существует объект, для которого требуется форматтер. то вы можете вызвать форматировщик.

class Foo 
{ 
    public IOutputFormatter Formatter {get;set;} 
} 

var foo = new Foo(); 
foo.Formatter = new GeneralFormatter(); 
Console.WriteLine(foo.formatter.FormatValue("one"); 

foo.Formatter = new FizzBuzzFormatter(); 
Console.WriteLine(foo.formatter.FormatValue("one"); 

Как устанавливается форматирование, или какой форматировщик установлен, может быть ответственен другой объект.

+0

Ну, вот как это закодировано. В настоящее время определенная стратегия задается в классе FizzBuzzStrategySelector. – jason

+0

, то пример путает проблему стратегии с заводскими и регистрационными шаблонами –

+0

Спасибо! Тогда я посмотрю на них и попытаюсь разобраться. – jason

2

С (как вы знаете) Узор стратегия является излишеством для этой проблемы, то трудно сказать, что было бы «хорошо» или «плохо» дизайн. Тем не менее, моя инстинктивная реакция была бы переместить логику выбора стратегии в стратегии себя, например, так:

class FizzBuzzFormatter : IOutputFormatter 
{ 
    public bool Handles(int value) { return value.IsDivisibleBy(15); } 

    public string Handle(int value) { return "FizzBuzz"; } 
} 

Это может быть немного лучше с точки зрения компонуемости, но вам все еще нужно, чтобы убедиться, что у вас есть список от IOutputFormattersв правильном порядке. С проблемой это мало, вы можете уйти от чего угодно. С большой проблемой вам нужно подумать об этом и решить сами.