首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 設計模式無廢話系列(十四):Template Method 模板方法模式

     編輯:關於C#

意圖

定義算法骨架,將部分步驟延遲到子類,使子類不改變算法結構即可重定義特定步驟。

適用場景

支付網關整合:提交介面與網關回調介面。各網關參數格式不同(如金額參數 money vs amount),但提交流程固定:

  1. 獲取訂單、驗證合法性
  2. 生成提交表單
  3. 記錄日誌
  4. 提交至對應網關

生成表單與記錄日誌因網關而異,流程其餘相同。引入 Template Method 復用不變部分,變化留給子類。

完整範例程式碼

using System;
using System.Collections.Generic;
using System.Text;

namespace TemplateMethodExample
{
    class Program
    {
        static void Main(string[] args)
        {
            PayGateway pg = new IPSGateway();
            pg.SubmitOrder(new Order());
        }
    }
    class Order { }
    class SubmitForm { }
    abstract class PayGateway
    {
        protected abstract void WriteLog(SubmitForm sf);
        protected abstract SubmitForm GenerateOrderForm(Order order);
        public void SubmitOrder(Order order)
        {
            if (order == null) { Console.WriteLine("Invalid Order"); return; }
            SubmitForm sf = GenerateOrderForm(order);
            if (sf == null) { Console.WriteLine("Generate Submit Form Failed"); return; }
            WriteLog(sf);
        }
    }
    class IPSGateway : PayGateway
    {
        protected override void WriteLog(SubmitForm sf) => Console.WriteLine("Log Wrote");
        protected override SubmitForm GenerateOrderForm(Order order)
        {
            Console.WriteLine("Submit Form Generated");
            return new SubmitForm();
        }
    }
}

程式碼執行結果

Template Method 執行結果

程式碼解析

  • PayGateway:抽象模板角色。SubmitOrder 為模板方法,封裝固定流程;WriteLog、GenerateOrderForm 為抽象步驟,延遲至子類實現。
  • IPSGateway:具體模板角色,依特定網關介面實作變化步驟。

何時採用

  • 某類操作擁有共同實現骨架與不同實現細節 → 以模板方法封裝統一部分。

實作要點

  • 復用算法骨架,將可變細節留給子類實現。
  • 留給子類的方法需在父類定義,可為抽象方法或帶預設實現的虛擬方法。

注意事項

  • 模板方法可說是「最不像設計模式的設計模式」,常與其他模式協用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved