您的位置:首页 > 其它

模板方法模式(Template Method)

2012-08-10 09:56 106 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: