Net设计模式实例之模板方法模式(Template Mothed Pattern)(2)

四.实例分析(Example

1、场景

定义一个数据操作Select的骨架,即Connect连接数据库,Select查询数据返回到数据集DataSet,对得到的结果DataSet进行处理Process查询符合自己的数据。ConnectRun是公用的可以放到抽象类DataAccessObject中,特定步骤SelectProcess交由子类来处理。结构如下图所示
Net设计模式实例之模板方法模式(Template Mothed Pattern)(2)
DataAccessObject:定义了一个算法框架,具体子类将重新定义SelectProcess操作。
子类CategoriesProducts:分别实现父类的SelectProcess操作

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、子类CategoriesProducts实现模板类中的方法SelectProcess
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、实例运行结果

Net设计模式实例之模板方法模式(Template Mothed Pattern)(2)

五、总结(Summary

本文对模板方法模式设计思想、结构和结构代码进行了分析,并以一实例数据操作进一步阐述了模板方法模式的设计及其C#实现。









本文转自 灵动生活 51CTO博客,原文链接:http://blog.51cto.com/smartlife/270976,如需转载请自行联系原作者