#!/usr/bin/env /friends/bin/monoscript using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; /* * FizzBuzz (ストラテジーパターン版) * * 特徴 * 1.FizzBuzzになるための条件と、条件が成立した場合のアクションをクラスに委譲。 * 2.機能追加はクラス作成してファクトリー部分(コンストラクタ)に追加。 */ namespace ConsoleApplication2 { class Program { static void Main(string[] args) { int input = 1; int max = 100; FizzBuzz objFizBuz = new FizzBuzz(); string msg = ""; try { for (int i = input; i <= max; i++) { msg += objFizBuz.DoFizzBuzz(i); } Console.WriteLine(msg); } catch (Exception ex) { ex.ToString(); } } } // strategyパターン用IF interface IStrategy { bool IsFizzBuzz(int i); string DoFizzBuzz(); } // strategy インターフェイスを用いてアルゴリズムを実装 class Fizz : IStrategy { public bool IsFizzBuzz(int i) { return (i % 3) == 0; } public string DoFizzBuzz() { return "Fizz"; } } class Buzz : IStrategy { public bool IsFizzBuzz(int i) { return (i % 5) == 0; } public string DoFizzBuzz() { return "Buzz"; } } class FizzBuzz { private List strategy = new List(); public FizzBuzz() { // クラスを新規作成して、ここに追加すれば良い this.strategy.Add(new Fizz()); this.strategy.Add(new Buzz()); } public string DoFizzBuzz(int i) { if (i == 0) return ""; string msg = ""; bool isAllFizzBuzz = true; foreach (IStrategy st in this.strategy) { if (st.IsFizzBuzz(i)) { msg += st.DoFizzBuzz(); } else { isAllFizzBuzz = false; } } // 全ての条件が正の場合 if (isAllFizzBuzz) { msg = ""; // 全部のメッセージをマージして出力 foreach (IStrategy st in this.strategy) { msg += st.DoFizzBuzz(); } } else if (string.Empty == msg) { msg = i.ToString(); } return msg + Environment.NewLine; } } }