Template Method Pattern
一,Define
定义一个操作中算法的骨架(skeleton),以将一些步骤延缓到子类中实现。模版方法让子类重新定义一个算法的某些步骤而无须改变算法的结构。
二,类和对象的关系
1,AbstractClass
定义一个抽象原始的操作(primitive operations),其子类可以重定义它实现一个算法的各个步骤。
实现一个模版方法定义一个算法的骨架。此模版方法不仅可以调用原始的操作,还可以调用定义于AbstractClass中的方法或其他对象中的方法。
2,ConnecreteClass
实现原始的操作以完成子类特定算法的步骤。
举个例子:
using System;
using System.Data;
using System.Data.SqlClient;
namespace Template_Method
{
abstract class Dataobject
{
//Method
abstract public void Connect();
abstract public void Select();
abstract public void Process();
abstract public void Disconnect();
// the Template Method
public void Run()
{
Connect();
Select();
Process();
Disconnect();
}
}
class CustomerDataObject : Dataobject
{
private string connectionString = "Server=.;User ID=sa;password=sa;database=jxcbook; Connection Reset=FALSE";
private string commandString;
private DataSet dataset;
private SqlConnection DataConnection;
//
public override void Connect()
{
DataConnection = new SqlConnection(connectionString);
DataConnection.Open();
}
public override void Select()
{
commandString = "select top 5 * from 用户清单";
SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, DataConnection);
dataset = new DataSet();
dataAdapter.Fill(dataset, "Customers");
}
public override void Process()
{
DataTable dataTable = dataset.Tables["Customers"];
foreach (DataRow myRow in dataTable.Rows)
{
foreach (DataColumn myCol in dataTable.Columns)
Console.WriteLine(myRow[myCol].ToString());
}
}
public override void Disconnect()
{
dataset.Dispose();
DataConnection.Close();
}
}
}
实现类
class Program
{
static void Main(string[] args)
{
CustomerDataObject c = new CustomerDataObject();
c.Run();
Console.ReadLine();
}
}
总结:摸版方法模式在一个类中形式化地定义算法,而由它的子类实现细节的处理。摸版方法模式的优势是,
在子类定义处理算法时不会改变算法的结构。
摸版方法的特点在于,每个不同的实现都需要定义一个子类,这也符合高内聚的责任分配的原则。
推荐场景:
1,将相同的算法放在一个类中,将算法变化的部分放在子类中的实现。
2,子类公共的算法应该放在一个公共的类中