Template Method Design Pattern

By Peter Bromberg

The intent of the Template Method design pattern is to provide an outline of a series of steps for an algorithm. Derived classes retain the original structure of the algorithm but have the option to redefine or adjust certain steps of the algorithm. This pattern is designed to offer extensibility to the client programmer. Template Methods are frequently used when building a class library (for example an application framework) that is going to be used by other client programmers.

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

namespace Patterns
{
  
    class MainApp
    {
      
        static void Main()
        {
            DataAccessObject daoCategories = new Categories();
             daoCategories.Run();

            DataAccessObject daoProducts = new Products();
             daoProducts.Run();

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

    /// <summary>
    /// The 'AbstractClass' abstract class
    /// </summary>
    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();

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

         // The 'Template Method'
        public void Run()
        {
           Connect();
            Select();
           Process();
           Disconnect();
        }
     }

    /// <summary>
    /// A 'ConcreteClass' class
    /// </summary>
    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();
        }
     }

    /// <summary>
    /// A 'ConcreteClass' class
    /// </summary>
    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();
        }
     }
}

Template Method Design Pattern  (769 Views)