二十五.行为型设计模式——Template Method Pattern(模版方法模式)

  • 定义

  定义一个操作中算法的骨架(skeleton),以将一些步骤延缓到子类中实现。模版方法让子类重新定义一个算法的某些步骤而无须改变算法的结构。

  UML类图如下:

  

  其中类和对象关系为:

  1.AbstractClass(抽象类):定义一个抽象原始的操作,其子类可以重定义它实现一个算法的各个步骤;实现一个模版方法定义一个算法的骨架,此模版方法不仅可以调用原始的操作,还可以调用定义于AbstractClass中的方法或其他对象中的方法。

  2.ConcreteClass(具体子类):实现原始的操作以完成子类特定算法的步骤。

  典型应用的顺序图如下:

  

  • 实例1——数据库连接模版

  下面的代码演示了模版方法。Run()提供了调用方法顺序的骨架,在CustomerDataObject子类延缓实现了Connect,Select,Process和Disconnect方法。类图如下:

  

View Code
namespace ConsoleApplication4

//AbstractClass抽象类
abstract class DataObject
{
//Methods方法
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();
}
}

//ConcreteClass 具体类
class CustomerDataObject : DataObject
{
private string connectionString = "Server=.uid=sa;pwd=sa;database=Northwind;Connection Reset=False;";
private string commandString;
private DataSet dataSet;
private SqlConnection dataConnection;
//Methods方法
public override void Connect()
{
dataConnection = new SqlConnection(connectionString);
dataConnection.Open();
}
public override void Select()
{
commandString = "Select top 5 CompanyName from Customers";
SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, dataConnection);
dataSet = new DataSet();
dataAdapter.Fill(dataSet, "Customers");
}
public override void Process()
{
DataTable dataTable = dataSet.Tables["Customers"];
foreach (DataRow dataRow in dataTable.Rows)
Console.WriteLine(dataRow["CompanyName"]);
}
public override void Disconnect()
{
dataSet.Dispose();
dataConnection.Close();
}
}

class Program
{
static void Main(string[] args)
{
CustomerDataObject c = new CustomerDataObject();
c.Run();
Console.Read();
}
}
}
  • 优势和缺陷

  模版方法模式在一个类中形式化地定义算法,而由它的子类实现细节的处理。模版方法模式的优势是,在子类定义处理算法时不会改变算法的结构。

  模版方法的特点在于,每个不同的实现都需要定义一个子类,这也复合高内聚的责任分配模式,不能说成是它的缺点。

  • 应用情景

  下面的情景很适合应用模版方法模式:

  1.你想将相同的算法放在一个类中,将算法变化的部分放在子类中实现。

  2.子类公共的算法应该放在一个公共的类中,避免代码重复。

  

posted on 2011-12-12 23:53  tLEE  阅读(321)  评论(0编辑  收藏  举报

导航