Design Pattern - Template模板模式

Template模板模式:

抽象父類別:定義了一個模板方法和抽象方法,該模板方法定義了框架及一系列流程。

子類別:透過繼承抽象父類別實作各個抽象方法,且不可改變流程。

優點:符合OCP開放封閉原則,新增功能,應要新增程式碼而不是修改既有程式碼來擴充系統,且也減少程式碼重複性以便於維護。

缺點:流程於抽象父類別中,而各個流程的實作邏輯於子類別中,程式碼較不易閱讀。

以下例子如撲克牌類的遊戲,可能都要經過:初始化遊戲→洗牌→發牌→開始遊戲→結束遊戲,因此可以將共用的流程,透過模板模式定義撲克牌類流程,而各子類別(卡牌類)各自實作各個流程的內容。

internal class Program
{
    static void Main(string[] args)
    {
        //執行大老二卡牌遊戲
        BigTwo bigTwo = new BigTwo();
        bigTwo.PlayCardTemplateMethod();

        Console.WriteLine("====================");

        //執行抽鬼牌卡牌遊戲
        DrawJoker drawJoker = new DrawJoker();
        drawJoker.PlayCardTemplateMethod();

        Console.ReadLine();
    }
}

/// <summary>
/// 卡牌遊戲模組
/// </summary>
public abstract class CardGame
{
    ///<summary>初始化遊戲</summary>
    public abstract void Initialize();

    ///<summary>洗牌</summary>
    public abstract void Shuffle();

    ///<summary>發牌</summary>
    public abstract void Deal();

    ///<summary>開始遊戲</summary>
    public abstract void StartPlay();

    ///<summary>結束遊戲</summary>
    public abstract void EndPlay();

    ///<summary>模板流程(定義流程)</summary>
    public void PlayCardTemplateMethod()
    {
        Initialize();

        Shuffle();

        Deal();

        StartPlay();

        EndPlay();
    }
}

/// <summary>
/// 抽鬼牌類別
/// </summary>
public class DrawJoker : CardGame
{
    public override void Initialize()
    {
        Console.WriteLine("抽鬼牌初始化");
    }

    public override void Shuffle()
    {
        Console.WriteLine("抽鬼牌洗牌");
    }

    public override void Deal()
    {
        Console.WriteLine("抽鬼牌發牌");
    }

    public override void StartPlay()
    {
        Console.WriteLine("抽鬼牌遊戲開始");
    }
    public override void EndPlay()
    {
        Console.WriteLine("抽鬼牌遊戲結束");
    }
}

/// <summary>
/// 大老二類別
/// </summary>
public class BigTwo : CardGame
{
    public override void Initialize()
    {
        Console.WriteLine("大老二初始化");
    }

    public override void Shuffle()
    {
        Console.WriteLine("大老二洗牌");
    }

    public override void Deal()
    {
        Console.WriteLine("大老二發牌");
    }
              
    public override void StartPlay()
    {
        Console.WriteLine("大老二遊戲開始");
    }
    public override void EndPlay()
    {
        Console.WriteLine("大老二遊戲結束");
    }
}