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

.NET 設計模式精解(十六):模板方法模式——定義演算法骨架,延遲步驟至子類實現

     編輯:關於.NET

李建忠老師曾言:「若只掌握一種設計模式,那必定是模板方法模式。」此模式極簡卻無處不在,定義演算法骨架於父類,將易變步驟延遲至子類實現,實現碼復用與擴充點的最佳平衡。

一、模式意圖與結構

意圖:定義演算法骨架,將特定步驟延遲至子類,不變更演算法結構即可重定義步驟。(GoF)

結構圖:

模板方法模式結構圖

二、生活實例:房屋建築規劃

建築師使用模板方法:地基、結構、水電走線為固定流程 (骨架);房間格局、裝潢風格延遲至具體專案 (子類) 決定:

建築規劃模板方法示意

三、資料庫存取範例:漸進式實作

抽象父類:定義骨架與模板方法

public abstract class DataAccessObject {
    protected string _connStr; protected DataSet _ds;
    public virtual void Connect() => _connStr = "Server=...;Database=Northwind";
    public abstract void Select();
    public abstract void Process();
    public virtual void Disconnect() => _connStr = "";
    // 模板方法:定義固定流程
    public void Run() {
        Connect(); Select(); Process(); Disconnect();
    }
}

具體子類:實作易變步驟

public class Categories : DataAccessObject {
    public override void Select() {
        var sql = "select CategoryName from Categories";
        var da = new SqlDataAdapter(sql, _connStr);
        _ds = new DataSet(); da.Fill(_ds, "Categories");
    }
    public override void Process() {
        Console.WriteLine("Categories ----");
        foreach (DataRow r in _ds.Tables["Categories"].Rows)
            Console.WriteLine(r["CategoryName"]);
    }
}
public class Products : DataAccessObject {
    public override void Select() { /* select top 10 ProductName ... */ }
    public override void Process() { /* 顯示 Products ... */ }
}

用戶端調用

var dao = new Categories(); dao.Run();
dao = new Products(); dao.Run();

關鍵觀察

  1. Connect/Disconnect 有預設實作 → virtual;Select/Process 無預設 → abstract。
  2. 模板方法 Run() 定義於基類,通常不允許子類覆寫 (可設 sealed 或 private/protected),屬於「好萊塢原則」:別調用我,讓我調用你。
  3. 提煉共同點:固定流程上移至父類,避免重複代碼。

四、.NET Framework 內建應用

繼承 RichTextBox 並覆寫 OnSelectionChanged、OnTextChanged 等受保護虛擬方法,即為模板方法模式應用:框架定義控制項生命週期骨架,開發者於特定擴充點注入自訂邏輯。

public class MyRichTextBox : RichTextBox {
    protected override void OnSelectionChanged(EventArgs e) {
        // 自訂選取變更邏輯...
    }
    protected override void OnTextChanged(EventArgs e) {
        // 自訂文字變更邏輯...
    }
}

五、實現要點、適用性與總結

  • 基礎性模式:虛函數多態提供靈活擴充點,代碼復用基石。
  • 反向控制:「別調用我,讓我調用你」典型應用。
  • 方法保護層級:被模板方法調用的虛方法建議設 protected。(李建忠)
  • 適用場景:一次性實現不變部分、提煉共同行為至父類 (重構以一般化)、控制子類擴充點 (Hook 操作)。

模板方法模式雖簡單,卻是類庫設計與框架建構的核心技術,掌握它即掌握了面向物件復用的精髓。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved