1. 定义
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。2. UML 类图
3. 结构代码
// Template Method pattern -- Structural example
|
using System;
namespace DoFactory.GangOfFour.Template.Structural { ///<summary> /// MainApp startup class for Real-World /// Template Design Pattern. ///</summary> classMainApp { ///<summary> /// Entry point into console application. ///</summary> staticvoid Main() { AbstractClass aA =new ConcreteClassA(); aA.TemplateMethod();
AbstractClass aB =new ConcreteClassB(); aB.TemplateMethod();
// Wait for user Console.ReadKey(); } }
///<summary> /// The 'AbstractClass' abstract class ///</summary> abstractclass AbstractClass { publicabstract void PrimitiveOperation1(); publicabstract void PrimitiveOperation2();
// The "Template method" publicvoid TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); Console.WriteLine(""); } }
///<summary> /// A 'ConcreteClass' class ///</summary> classConcreteClassA : AbstractClass { publicoverride void PrimitiveOperation1() { Console.WriteLine("ConcreteClassA.PrimitiveOperation1()"); } publicoverride void PrimitiveOperation2() { Console.WriteLine("ConcreteClassA.PrimitiveOperation2()"); } }
///<summary> /// A 'ConcreteClass' class ///</summary> classConcreteClassB : AbstractClass { publicoverride void PrimitiveOperation1() { Console.WriteLine("ConcreteClassB.PrimitiveOperation1()"); } publicoverride void PrimitiveOperation2() { Console.WriteLine("ConcreteClassB.PrimitiveOperation2()"); } } } |
Output
ConcreteClassA.PrimitiveOperation1()
ConcreteClassA.PrimitiveOperation2() |
4. 实例代码
// Template Method pattern -- Real World example
|
using System; using System.Data; using System.Data.OleDb;
namespace DoFactory.GangOfFour.Template.RealWorld { ///<summary> /// MainApp startup class for Real-World /// Template Design Pattern. ///</summary> classMainApp { ///<summary> /// Entry point into console application. ///</summary> staticvoid Main() { DataAccessObject daoCategories =new Categories(); daoCategories.Run();
DataAccessObject daoProducts =new Products(); daoProducts.Run();
// Wait for user Console.ReadKey(); } }
///<summary> /// The 'AbstractClass' abstract class ///</summary> abstractclass DataAccessObject { protectedstring connectionString; protectedDataSet dataSet;
publicvirtual void Connect() { // Make sure mdb is available to app connectionString = "provider=Microsoft.JET.OLEDB.4.0; " + "data source=..\\..\\..\\db1.mdb"; }
publicabstract void Select(); publicabstract void Process();
publicvirtual void Disconnect() { connectionString = ""; }
// The 'Template Method' publicvoid Run() { Connect(); Select(); Process(); Disconnect(); } }
///<summary> /// A 'ConcreteClass' class ///</summary> classCategories : DataAccessObject { publicoverride void Select() { string sql ="select CategoryName from Categories"; OleDbDataAdapter dataAdapter =new OleDbDataAdapter( sql, connectionString);
dataSet = new DataSet(); dataAdapter.Fill(dataSet, "Categories"); }
publicoverride void Process() { Console.WriteLine("Categories ---- ");
DataTable dataTable = dataSet.Tables["Categories"]; foreach (DataRow rowin dataTable.Rows) { Console.WriteLine(row["CategoryName"]); } Console.WriteLine(); } }
///<summary> /// A 'ConcreteClass' class ///</summary> classProducts : DataAccessObject { publicoverride void Select() { string sql ="select ProductName from Products"; OleDbDataAdapter dataAdapter =new OleDbDataAdapter( sql, connectionString);
dataSet = new DataSet(); dataAdapter.Fill(dataSet, "Products"); }
publicoverride void Process() { Console.WriteLine("Products ---- "); DataTable dataTable = dataSet.Tables["Products"]; foreach (DataRow rowin dataTable.Rows) { Console.WriteLine(row["ProductName"]); } Console.WriteLine(); } } } |
Output
Categories ----
Beverages Condiments Confections Dairy Products Grains/Cereals Meat/Poultry Produce Seafood Products ---- Chai Chang Aniseed Syrup Chef Anton's Cajun Seasoning Chef Anton's Gumbo Mix Grandma's Boysenberry Spread Uncle Bob's Organic Dried Pears Northwoods Cranberry Sauce Mishi Kobe Niku |
该文章来自:http://www.dofactory.com/Patterns/PatternTemplate.aspx