おーみんブログ

C#, ASP.NET Core, Unityが大好きです。

C#でTemplate Methodパターンを体験してみた。

はじめに

GoFデザインパターンの1つであるTemplate Methodパターンを体験してみました。

Template Methodパターンとは

Template Methodパターンとはスーパークラスで処理の枠組みを決めてそれを継承したサブクラスで具体的な処理を書いていくというパターンです。同じような流れの処理を複数書く時などに利用できます。

サンプルコード

以下にサンプルコードを記載します。 スーパークラス(Templateクラス)のPlayメソッドにて朝昼夜の処理の流れを決めます。 その後、Templateクラスを継承した平日クラス(Weekday)と休日クラス(Holiday)にて具体的な処理を書いています。

public class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("平日の過ごし方");
        Template weekday = new Weekday();
        weekday.Play();

        Console.WriteLine("-------------------");

        Console.WriteLine("休日の過ごし方");
        Template holiday = new Holiday();
        holiday.Play();
    }
}

//スーパークラスで処理の枠組みを決めます。
public abstract class Template
{
    protected abstract void Morning();
    protected abstract void Afternoon();
    protected abstract void Night();

    public void Play()
    {
        Morning();
        Afternoon();
        Night();
    }
}

public class Weekday : Template
{
    protected override void Morning()
    {
        Console.WriteLine("朝:行きの電車に乗る");
    }

    protected override void Afternoon()
    {
        Console.WriteLine("昼:会社でお仕事をする");
    }

    protected override void Night()
    {
        Console.WriteLine("夜:帰りの電車に乗る");
    }
}

public class Holiday : Template
{
    protected override void Morning()
    {
        Console.WriteLine("朝:朝寝をする");
    }

    protected override void Afternoon()
    {
        Console.WriteLine("昼:昼寝をする");
    }

    protected override void Night()
    {
        Console.WriteLine("夜:夜寝をする");
    }
}
平日の過ごし方
朝:行きの電車に乗る
昼:会社でお仕事をする
夜:帰りの電車に乗る
-------------------
休日の過ごし方
朝:朝寝をする
昼:昼寝をする
夜:夜寝をする

おわりに

仮にTemplateメソッドを使わずに同じ実装をしようとすると、WeekdayクラスとHolidayクラスにPlayメソッドを作る必要がありますので少し複雑になってしまいそうです(まあ、このサンプルコード程度ではそんなに複雑さは感じませんが...)。 なるべく似たような処理は共通化していくよう心掛けていきます!!