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も使ってみました.が,今回のシチュエーションで使用することはないはず(使用するくらいなら,そのままメソッド呼び出したほうが早い).
ま,実装案として参考にしてみてください.