点点滴滴


         从点开始绘制自己的程序人生
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Template Method

Posted on 2006-10-29 15:26  点点滴滴  阅读(192)  评论(0编辑  收藏  举报
// Template Method pattern -- Real World example

using System;
using System.Data;
using System.Data.OleDb;

namespace DoFactory.GangOfFour.Template.RealWorld
{
  
  // MainApp test application

  class MainApp
  {
    static void Main()
    {
      DataAccessObject dao;
      
      dao = new Categories();
      dao.Run();

      dao = new Products();
      dao.Run();

      // Wait for user
      Console.Read();
    }
  }

  // "AbstractClass"

  abstract class DataAccessObject
  {
    protected string connectionString;

    protected DataSet dataSet;

    public virtual void Connect()
    {
      // Make sure mdb is on c:\
      connectionString =
        "provider=Microsoft.JET.OLEDB.4.0; " +
        "data source=c:\\nwind.mdb";
    }

    public abstract void Select();
    public abstract void Process();

    public virtual void Disconnect()
    {
      connectionString = "";
    }

    // The "Template Method"

    public void Run()
    {
      Connect();
      Select();
      Process();
      Disconnect();
    }
  }

  // "ConcreteClass"

  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();
    }
  }
}