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

C# 設計模式精講:模板方法模式

     編輯:關於C#

一、模板方法模式:定義算法骨架,延遲步驟到子類

在抽象類中實現算法不變部分(模板方法),將可變步驟聲明為抽象方法(基本方法)強制子類實現。不同子類提供不同實現,從而實現算法多樣性。這是基於繼承的代碼復用基石,也是面向對象設計核心。

二、兩大角色結構

模板方法模式結構圖

  • 抽象模板角色:定義抽象基本操作;實現模板方法,組合基本操作形成算法骨架。
  • 具體模板角色:實現父類抽象基本操作,提供具體步驟邏輯。

一個抽象模板可對應多個具體模板,各自給出不同步驟實現。

三、結構型示例


// Template Method pattern -- Structural example
using System;

abstract class AbstractClass {
    abstract public void PrimitiveOperation1();
    abstract public void PrimitiveOperation2();
    public void TemplateMethod() {
        Console.WriteLine("In AbstractClass.TemplateMethod()");
        PrimitiveOperation1();
        PrimitiveOperation2();
    }
}

class ConcreteClass : AbstractClass {
    public override void PrimitiveOperation1() { Console.WriteLine("Called ConcreteClass.PrimitiveOperation1()"); }
    public override void PrimitiveOperation2() { Console.WriteLine("Called ConcreteClass.PrimitiveOperation2()"); }
}

public class Client {
    public static void Main() {
        ConcreteClass c = new ConcreteClass(); c.TemplateMethod();
    }
}

四、繼承作為復用工具的認知演進

  1. 不知其一:初學者不懂繼承,靠委派復用。
  2. 知其一、不知其二:發現繼承易用,濫用繼承替代委派,有濫用風險。
  3. 知其二:專家警告繼承濫用,提倡組合/委派替代(GOF 多數模式皆此道)。
  4. 知其三:繼承非完全不可用。類型層次結構利於抽象設計與復用。模板方法模式鼓勵恰當使用繼承:將通用行為上移基類,特化行為下放子類。

五、實戰應用:數據庫訪問模板


// Template Method pattern -- Real World example
using System; using System.Data; using System.Data.OleDb;

abstract class DataObject {
    abstract public void Connect();
    abstract public void Select();
    abstract public void Process();
    abstract public void Disconnect();
    public void Run() { // 模板方法
        Connect(); Select(); Process(); Disconnect();
    }
}

class CustomerDataObject : DataObject {
    private string connStr = "provider=Microsoft.JET.OLEDB.4.0; data source=c:\\nwind.mdb";
    private string cmdStr; private DataSet ds;
    public override void Connect() { /* 無操作 */ }
    public override void Select() {
        cmdStr = "select CompanyName from Customers";
        OleDbDataAdapter da = new OleDbDataAdapter(cmdStr, connStr);
        ds = new DataSet(); da.Fill(ds, "Customers");
    }
    public override void Process() {
        DataTable dt = ds.Tables["Customers"];
        foreach (DataRow dr in dt.Rows) Console.WriteLine(dr["CompanyName"]);
    }
    public override void Disconnect() { /* 無操作 */ }
}

public class TemplateMethodApp {
    public static void Main() { new CustomerDataObject().Run(); }
}

註:需 C 盤根目錄有 nwind.mdb(Office 安裝目錄可尋)。

六、模板方法中的三類基本方法

類型定義者實現者說明
抽象方法抽象類具體子類以 abstract 標記,強制子類實現
具體方法抽象類抽象類已實現,子類不覆蓋
鉤子方法抽象類抽象類/子類默認空實現,子類可選擇性擴展,命名常以 do 開頭

七、重構原則:行為上移,狀態下放

  1. 根據行為而非狀態定義類。
  2. 實現行為時用抽象狀態(調用取值方法)而非具體狀態(直接引用屬性)。
  3. 劃分操作層次,核心方法置於 Kernel Methods 供子類替換。
  4. 狀態屬性聲明延遲到子類;抽象類調用抽象取值方法。

遵循此原則可將介面與實現、抽象與具體分離,最大化代碼復用,這正是模板方法模式的指引方向。

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