私は最近、ストラテジーパターンを実際に使用しました。私は、このパターンが私のハンマーであり、他のすべてが釘であるハンマー/釘症候群に自分自身を見つけます。キックについては、戦略パターンを介してFizzBuzzを実装してみることにしました。今、私はこれが完全に殺し過ぎていることを知っています。さまざまなエンタープライズ実装を見てきましたが、これは私自身の実装です。
驚いたことに、この演習では興味深い質問がありました。使用するものを選択するのに役立つ戦略と組み合わせて機能する標準または別のパターンはありますか?以下の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";;
}
}