TemplateMethodパターンは、処理手順を基底クラスで定義し、処理の異なる部分を派生クラスで再定義することで多様な振る舞いを実現するものです。
using System; namespace TemplateMethod { //--------------------------------------------------- // デザインパターン TempleteMethod // // 処理手順を抽象クラスで定義し、処理の異なる部分 // を派生クラスで定義することで、多様な振る舞いを // 実現するパターン // // コメント:身近な例が一番わかりやすいかも?? //--------------------------------------------------- public abstract class AbstractClass_Nanpa { //お約束(定型処理) public void TemplateMedhod() { //ここには通常行うメソッドを登録する Console.WriteLine("映画を見る"); Console.WriteLine("ドライブする"); Console.WriteLine("食事する"); } //以下のメソッドには派生クラスで行う特有の //処理を派生クラスで実装させることになります。 //下記のメソッドは本来、Protectedなのですが、 //この例ではアクセス修飾子が変更できないためPublicとします。 //独自処理 かっこよく決める場合 public abstract void PrimitiveOperation_CoolStyle(); //独自処理 楽しく人柄を装う場合 public abstract void PrimitiveOperation_FunnyStyle(); } public class ConcreteClass_Kugy : AbstractClass_Nanpa { public override void PrimitiveOperation_CoolStyle() { Console.WriteLine("俺は、ダイバーだぜ、君のハートに素潜りさ!"); } public override void PrimitiveOperation_FunnyStyle() { Console.WriteLine("僕って、ほんとは、おっぱい星人かも??"); } } public class ConcreteClass_Yoshy : AbstractClass_Nanpa { public override void PrimitiveOperation_CoolStyle() { //実装なし } public override void PrimitiveOperation_FunnyStyle() { Console.WriteLine("デートプランは完璧なんだけど、だれか!僕を誘ってぇ~"); } } /// <summary> /// Class1 の概要の説明です。 /// </summary> class Class1 { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main(string[] args) { Console.WriteLine("くぎちゃんの場合"); //くぎちゃん登場 ConcreteClass_Kugy kugi =new ConcreteClass_Kugy(); //ナンパ開始 //まずはいつものように kugi.TemplateMedhod(); //ここで決めるぜ!! kugi.PrimitiveOperation_CoolStyle(); //でも本当は。 kugi.PrimitiveOperation_CoolStyle(); Console.WriteLine("たかちゃんの場合"); //たかちゃん登場 ConcreteClass_Yoshy taka =new ConcreteClass_Yoshy(); //ナンパ開始 //まずはいつものように taka.TemplateMedhod(); //ここで決めるぜ!! // //takao.CoolStyle(); おっと!いけねえ。私は実装しておまへんがな!! //しかたない!!これでどうだあ! taka.PrimitiveOperation_FunnyStyle(); } } }
1: package templatemethod; 2: 3: public abstract class AbstractClass_Nampa { 4: 5: public void templateMethod() { 6: //ここには通常行う処理を記述する 7: System.out.println("映画を見る"); 8: System.out.println("ドライブする"); 9: System.out.println("食事する"); 10: } 11: 12: //独自処理の実装はサブクラスにて行う(Coolに決める場合) 13: public abstract void primitiveOperation_CoolStyle(); 14: //独自処理の実装はサブクラスにて行う(楽しく人柄を装う場合) 15: public abstract void primitiveOperation_FunnyStyle(); 16: 17: }
1: package templatemethod; 2: 3: public class ConcreteClass_Kugy extends AbstractClass_Nampa { 4: 5: 6: public void primitiveOperation_CoolStyle() { 7: System.out.println("俺は、ダイバーだせ、君のハートに素潜りさ"); 8: } 9: public void primitiveOperation_FunnyStyle() { 10: System.out.println("僕って、本当はおっぱい星人かも??"); 11: } 12: 13: }
1: package templatemethod; 2: 3: public class ConcreteClass_Yoshy extends AbstractClass_Nampa { 4: 5: public void primitiveOperation_CoolStyle() { 6: //実装なし 7: } 8: public void primitiveOperation_FunnyStyle() { 9: System.out.println("デートプランは完璧なんだけど、誰か!僕をさそってぇ~!"); 10: } 11: }
1: package templatemethod; 2: 3: public class StartClass { 4: 5: public static void main(String[] args) { 6: //Kugyの場合 7: System.out.println("くぎちゃんの場合"); 8: //Kugyインスタンス生成 9: ConcreteClass_Kugy kugy =new ConcreteClass_Kugy(); 10: 11: //Started NampaStory 12: kugy.templateMethod(); 13: //ここで決めるぜ! 14: kugy.primitiveOperation_CoolStyle(); 15: //でも本当は。 16: kugy.primitiveOperation_FunnyStyle(); 17: 18: //Yoshyの場合 19: System.out.println("よっしぃちゃんの場合"); 20: 21: ConcreteClass_Yoshy yoshy =new ConcreteClass_Yoshy(); 22: //まずはいつものように 23: yoshy.templateMethod(); 24: 25: //おっと!じっそうしておまへんがな コメントアウトしておこう 26: //yoshy.primitiveOperation_CoolStyle(); 27: 28: //仕方が無い、これでどうだあ。 29: yoshy.primitiveOperation_FunnyStyle(); 30: } 31: }
デザインパターン「ひとくちメモ」へ
Homeへもどる