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("大老二遊戲結束");
}
}