2014年09月27日

テンプレート

Template

テンプレートとは「型枠」とか「鋳型」という意味であった。
デザインパターンでは、処理の大枠を基底クラス側で、具体的な内容はサブクラス側で定義する。

サンプルコード

基本構成は以下のようなもの。
    // 基底となる抽象クラス
    public abstract class TemplateBase
    {
        // このメソッドが呼ばれる
        public void TemplateMethod()
        {
            Method1();
            Method2();
            Method3();
        }
        // 個々の実装はサブクラス側に任せる
        public abstract void Method1();
        public abstract void Method2();
        public abstract void Method3();
    }
    // サブクラスA
    public class TemplateA : TemplateBase
    {
        public override void Method1()
        {
            Console.WriteLine(" TemplateA Method1");
        }
        public override void Method2()
        {
            Console.WriteLine(" TemplateA Method2");
        }
        public override void Method3()
        {
            Console.WriteLine(" TemplateA Method3");
        }
    }
    // サブクラスB
    public class TemplateB : TemplateBase
    {
        public override void Method1()
        {
            Console.WriteLine(" TemplateB Method1");
        }
        public override void Method2()
        {
            Console.WriteLine(" TemplateB Method2");
        }
        public override void Method3()
        {
            Console.WriteLine(" TemplateB Method3");
        }
    }

    // これらを使う側
    class Tester
    {
        static void Main(string[] args)
        {
            TemplateBase ta = new TemplateA();
            ta.TemplateMethod();

            TemplateBase tb = new TemplateB();
            tb.TemplateMethod();
         }
     }


サンプル

具体的な使用例
ここでは処理を想定の順序で使われることを強制している。
    public abstract class DatabaseAccessBase
    {
       // このメソッドが呼ばれることにより、必ず
       // Open→Execute→Closeの順が保障される。
        public ArrayList Select(string command)
        {
            Open();
            var ret = ExecuteQuery(command);
            Close();

            return ret;
        }

        public abstract void Open();
        public abstract ArrayList ExecuteQuery(string command);
        public abstract void Close();
    }

    public class SqlServerAccess : DatabaseAccessBase
    {
        private IDbConnection _cnn;
        public override void Open()
        {
            _cnn = new SqlConnection(@"connectionString");
            _cnn.Open();
        }
        public override ArrayList ExecuteQuery(string command)
        {
            var cmd = _cnn.CreateCommand();
            cmd.CommandText = command;

            var reader = cmd.ExecuteReader();
            var list = new ArrayList();

            while(reader.Read())
            {
                object[] values = new object[reader.FieldCount];
                list.Add(reader.GetValues(values));
            }

            return list;
        }

        public override void Close()
        {
            _cnn.Close();
            _cnn.Dispose();
        }
    }

サンプルその3

処理の大枠は基底クラス側で実装し、内容の異なる部分のみサブクラス側で実装するパターン。
    public abstract class ExerciseBase
    {
        public void TakeExercise()
        {
            WarmingUP();
            Do();
            CoolDown();
        }

        virtual protected void WarmingUP()
        {
            Console.WriteLine("Warming up..");
        }
        abstract protected void Do();
        virtual protected void CoolDown()
        {
            Console.WriteLine("Cool down..");
        }
    }

    public class Running : ExerciseBase 
    {
        protected override void Do()
        {
            Console.WriteLine("Running...");
        }
    }

    public class Jogging : ExerciseBase
    {
        protected override void WarmingUP()
        {
            Console.WriteLine("Nothing to do..");
        }
        protected override void Do()
        {
            Console.WriteLine("Jogging...");
        }
    }

    class Tester
    {
        static void Main(string[] args)
        {
            var run = new Running();
            run.TakeExercise();

            var jog = new Jogging();
            jog.TakeExercise();
        }
    }

posted by RR at 23:41 | Comment(0) | デザインパターン | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。