Unity学習ノート:設計モード-TEMPLATE METHOD(テンプレート方法)


キーワード(スケルトン)
機能実装の大きなプロセスは決定されていますが、各ステップには異なる実装がある場合があります.親クラスで定義されたプロセス(スケルトン)サブクラスは、各ステップの具体的な実装を担当します.(eg:団建活動:宿泊会議固定、娯楽活動自由選択)
意図:
操作中のアルゴリズムのスケルトンを定義し、いくつかのステップをサブクラスに遅延します.TemplateMethodは、サブクラスがアルゴリズムの構造を変更することなく、アルゴリズムの特定のステップを再定義できるようにする.
適用:
•アルゴリズムの不変の部分を一度に実装し、可変な動作をサブクラスに残して実装します.
•コードの重複を回避するために、各サブクラスの共通の動作を抽出し、共通の親にセットする必要があります.これは,O p d y k eとJ o h n s o nが記述した「一般化のための再分解」の良い例[O J 9 3]である.まず認識する
既存のコードの違いは、異なる点を新しい操作に分離します.最後に、これらの異なるコードを、これらの新しい操作を呼び出すテンプレートメソッドで置き換えます.
•サブクラス拡張を制御します.テンプレートメソッドは、特定のポイントでのみ「h o o k」アクション(効果のセクションを参照)を呼び出し、これらのポイントでのみ拡張を許可します.
ケース:(eg:団建活動:宿泊会議固定、娯楽活動自由選択)
namespace TemplateMethod_DesignPattern
{
    using System;

    class Algorithm
    {
        public void DoAlgorithm()
        {
            Console.WriteLine("In DoAlgorithm");

            // do some part of the algorithm here

            // step1 goes here
            Console.WriteLine("In Algorithm - DoAlgoStep1");
            // . . . 

            // step 2 goes here
            Console.WriteLine("In Algorithm - DoAlgoStep2");
            // . . . 

            // Now call configurable/replacable part
            DoAlgoStep3();

            // step 4 goes here
            Console.WriteLine("In Algorithm - DoAlgoStep4");
            // . . . 

            // Now call next configurable part
            DoAlgoStep5();
        }

        virtual public void DoAlgoStep3()
        {
            Console.WriteLine("In Algorithm - DoAlgoStep3");
        }

        virtual public void DoAlgoStep5()
        {
            Console.WriteLine("In Algorithm - DoAlgoStep5");
        }
    }

    class CustomAlgorithm : Algorithm
    {
        public override void DoAlgoStep3()
        {
            Console.WriteLine("In CustomAlgorithm - DoAlgoStep3");
        }

        public override void DoAlgoStep5()
        {
            Console.WriteLine("In CustomAlgorithm - DoAlgoStep5");
        }
    }

    /// 
    ///    Summary description for Client.
    /// 
    public class Client
    {
        public static int Main(string[] args)
        {
            CustomAlgorithm c = new CustomAlgorithm();

            c.DoAlgorithm();

            return 0;
        }
    }
}