一、模板方法模式簡介(Brief Introduction)
模板方法模式(Template Method Pattern),定義一個操作中的算法骨架,而將一些步驟 延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可以重定義算法的某些特定 步驟。模板方法模式把不變行為搬移到超類,從而去除子類中的重復代碼,實際上模板方法 模式就是提供了一個代碼復用平台。
二、解決的問題(What To Solve)
要完成在某一細節上層次一致的一個過程或一系列步驟,但個別步驟在更詳細的層次上 實現不同時,可以使用模版方法模式解決問題。
三、模板方法模式分析(Analysis)1、模板方法模式結構
抽象類AbstractClass,實現了一個模版方法,定義了一個算法框架,具體子類將重新定 義PrimitiveOperation1和PrimitiveOperation1以實現一個算法的步驟。
子類ConcreteClassA和ConcreteClassB,實現PrimitiveOperation1和 PrimitiveOperation1以完成算法中與特定子類相關的步驟。
2、模板方法模式代碼
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
{
public override void PrimitiveOperation1()
{
Console.WriteLine("具體實現類{0}方法1實現", this.GetType ().Name);
}
public override void PrimitiveOperation2()
{
Console.WriteLine("具體實現類{0}方法2實現", this.GetType ().Name);
}
}
3、客戶端代碼
static void Main(string[] args)
{
AbstractClass abstractClass = new ConcreteClassA();
abstractClass.TemplateMethod();
abstractClass = new ConcreteClassB();
abstractClass.TemplateMethod();
Console.ReadKey();
}
3、模板方法模式運行結果
四.實例分析(Example)1、場景
定義一個數據操作Select的骨架,即Connect連接數據庫,Select查詢數據返回到數據集 DataSet,對得到的結果DataSet進行處理Process查詢符合自己的數據。Connect和Run是公 用的可以放到抽象類DataAccessObject中,特定步驟Select和Process交由子類來處理。結 構如下圖所示
DataAccessObject類:定義了一個算法框架,具體子類將重新定義Select和Process操作 。
子類Categories和Products:分別實現父類的Select和Process操作
2、代碼
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
{
public override void Select()
{
string sql = "select ProductName from Products";
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, connectionString);
dataSet = new DataSet();
dataAdapter.Fill(dataSet, "Products");
}
public override void Process()
{
Console.WriteLine("Products ---- ");
DataTable dataTable = dataSet.Tables["Products"];
foreach (DataRow row in dataTable.Rows)
{
Console.WriteLine(row["ProductName"]);
}
Console.WriteLine();
}
}
3、客戶端代碼
static void Main(string[] args)
{
DataAccessObject daoCategories = new Categories();
daoCategories.Run();
DataAccessObject daoProducts = new Products();
daoProducts.Run();
Console.ReadKey();
}
3、實例運行結果
五、總結(Summary)
本文對模板方法模式設計思想、結構和結構代碼進行了分析,並以一實例數據操作進一 步闡述了模板方法模式的設計及其C#實現。
出處:http://www.cnblogs.com/ywqu