delegateでDecorator(2)

昨日のサンプルですが,今日一日なんかイマイチだなぁと思ってました.当初Decoratorパターンを意識していたのですが,全然Decoratorでないしいけてない.なので,もっとシンプルにリファクタしてみました.

class Program
{
  private delegate string PreProcessCallback(string s);

  private static string PreProcess1(string s)
  {
    return s.Replace("-", "");
  }
  private static string PreProcess2(string s)
  {
    return s.Replace("(","").Replace(")","");
  }
  private static string PreProcess(string s, List<PreProcessCallback> callbackList)
  {
    if (callbackList != null && callbackList.Count != 0)
    {
      foreach (PreProcessCallback callback in callbackList)
      {
        s = callback(s);
      }
    }

    return s;
  }

  static void Main(string[] args)
  {
    string telno1 = "01234567890";
    string telno2 = "012-3456-7890";
    string telno3 = "012-(3456)-7890";
    string telno4 = "0123-(456)-7890";

    List<PreProcessCallback> callbackList1 = new List<PreProcessCallback>();
    callbackList1.Add(PreProcess1);

    List<PreProcessCallback> callbackList2 = new List<PreProcessCallback>();
    callbackList2.Add(PreProcess1);
    callbackList2.Add(PreProcess2);

    List<PreProcessCallback> callbackList3 = new List<PreProcessCallback>();
    callbackList3.Add(delegate(string s) { return s.Replace("-", ""); });
    callbackList3.Add(delegate(string s) { return s.Replace("(", "").Replace(")", ""); });

    Console.WriteLine("telno1:=[{0}]",PreProcess(telno1,null));
    Console.WriteLine("telno2 before:=[{0}]", telno2);
    Console.WriteLine("telno2 after :=[{0}]", PreProcess(telno2,callbackList1));
    Console.WriteLine("telno3 before:=[{0}]", telno3);
    Console.WriteLine("telno3 after :=[{0}]", PreProcess(telno3,callbackList2));
    Console.WriteLine("telno4 before:=[{0}]", telno4);
    Console.WriteLine("telno4 after :=[{0}]", PreProcess(telno4, callbackList3));
  }
}

実行結果

telno1:=[01234567890]
telno2 before:=[012-3456-7890]
telno2 after :=[01234567890]
telno3 before:=[012-(3456)-7890]
telno3 after :=[01234567890]
telno4 before:=[0123-(456)-7890]
telno4 after :=[01234567890]

せっかくなのでAnonymous Methodも使ってみました.が,今回のシチュエーションで使用することはないはず(使用するくらいなら,そのままメソッド呼び出したほうが早い).


ま,実装案として参考にしてみてください.