模闆方法模式(Template Method Pattern),定義一個操作中的算法骨架,而将一些步驟延遲到子類中。模闆方法使得子類可以不改變一個算法的結構即可以重定義算法的某些特定步驟。模闆方法模式把不變行為搬移到超類,進而去除子類中的重複代碼,實際上模闆方法模式就是提供了一個代碼複用平台。
要完成在某一細節上層次一緻的一個過程或一系列步驟,但個别步驟在更詳細的層次上實作不同時,可以使用模版方法模式解決問題。

抽象類AbstractClass,實作了一個模版方法,定義了一個算法架構,具體子類将重新定義PrimitiveOperation1和PrimitiveOperation1以實作一個算法的步驟。
子類ConcreteClassA和ConcreteClassB,實作PrimitiveOperation1和PrimitiveOperation1以完成算法中與特定子類相關的步驟。
1、抽象模闆類AbstractClass及其模闆方法TemplateMethod()
public abstract class AbstractClass
{
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
public void TemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
Console.WriteLine("模闆方法執行完");
}
}
2、子類ConcreteClassA、ConcreteClassB實作父類定義的抽象方法
public class ConcreteClassA:AbstractClass
public override void PrimitiveOperation1()
Console.WriteLine("具體實作類{0}方法1實作",this.GetType().Name);
public override void PrimitiveOperation2()
Console.WriteLine("具體實作類{0}方法2實作", this.GetType().Name);
public class ConcreteClassB:AbstractClass
Console.WriteLine("具體實作類{0}方法1實作", this.GetType().Name);
3、用戶端代碼
static void Main(string[] args)
AbstractClass abstractClass = new ConcreteClassA();
abstractClass.TemplateMethod();
abstractClass = new ConcreteClassB();
Console.ReadKey();
定義一個資料操作Select的骨架,即Connect連接配接資料庫,Select查詢資料傳回到資料集DataSet,對得到的結果DataSet進行處理Process查詢符合自己的資料。Connect和Run是公用的可以放到抽象類DataAccessObject中,特定步驟Select和Process交由子類來處理。結構如下圖所示
DataAccessObject類:定義了一個算法架構,具體子類将重新定義Select和Process操作。
子類Categories和Products:分别實作父類的Select和Process操作
1、抽象模闆類DataAccessObject及其模闆方法Run
abstract class DataAccessObject
protected string connectionString;
protected DataSet dataSet;
public virtual void Connect()
// Make sure mdb is available to app
connectionString =
"provider=Microsoft.JET.OLEDB.4.0;" +"data source=..\\..\\..\\db1.mdb";
public abstract void Select();
public abstract void Process();
public virtual void Disconnect()
connectionString = "";
// The 'Template Method'
public void Run()
Connect();
Select();
Process();
Disconnect();
2、子類Categories和Products實作模闆類中的方法Select、Process
class Categories : DataAccessObject
public override void Select()
string sql = "select CategoryName from Categories";
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, connectionString);
dataSet = new DataSet();
dataAdapter.Fill(dataSet, "Categories");
public override void Process()
Console.WriteLine("Categories ---- ");
DataTable dataTable = dataSet.Tables["Categories"];
foreach (DataRow row in dataTable.Rows)
{
Console.WriteLine(row["CategoryName"]);
}
Console.WriteLine();
class Products : DataAccessObject
string sql = "select ProductName from Products";
dataAdapter.Fill(dataSet, "Products");
Console.WriteLine("Products ---- ");
DataTable dataTable = dataSet.Tables["Products"];
Console.WriteLine(row["ProductName"]);
DataAccessObject daoCategories = new Categories();
daoCategories.Run();
DataAccessObject daoProducts = new Products();
daoProducts.Run();
本文對模闆方法模式設計思想、結構和結構代碼進行了分析,并以一執行個體資料操作進一步闡述了模闆方法模式的設計及其C#實作。
版權
作者:靈動生活 郝憲玮
如果你認為此文章有用,請點選底端的【推薦】讓其他人也了解此文章,
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。