The Template Method Design Pattern using C# .Net
- by nijhawan.saurabh
First of all I'll just put this pattern in context and describe its
intent as in the GOF book:
Template Method:
Define the skeleton of
an algorithm in an operation, deferring some steps to
Subclasses. Template
Method lets subclasses redefine certain steps of an algorithm
without changing the Algorithm's
Structure.
Usage:
When you are certain about the High Level steps involved in
an Algorithm/Work flow you can use the Template Pattern which allows the Base
Class to define the Sequence of the Steps but permits the Sub classes to alter
the implementation of any/all steps.
Example in the .Net framework:
The most common example is the Asp.Net Page Life Cycle. The
Page Life Cycle has a few methods which are called in a sequence but we have
the liberty to modify the functionality of any of the methods by overriding
them.
Sample implementation of Template
Method Pattern:
Let's see the class diagram
first:
Normal
0
false
false
false
EN-US
X-NONE
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin-top:0in;
mso-para-margin-right:0in;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0in;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;
mso-ligatures:standard;}
And here goes the code:EmailBase.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace TemplateMethod
8 {
9 public abstract class EmailBase
10 {
11
12 public bool SendEmail()
13 {
14 if (CheckEmailAddress() == true) // Method1 in the sequence
15 {
16 if (ValidateMessage() == true) // Method2 in the sequence
17 {
18 if (SendMail() == true) // Method3 in the sequence
19 {
20 return true;
21 }
22 else
23 {
24 return false;
25 }
26
27 }
28 else
29 {
30 return false;
31 }
32
33 }
34 else
35 {
36 return false;
37
38 }
39
40
41 }
42
43 protected abstract bool CheckEmailAddress();
44 protected abstract bool ValidateMessage();
45 protected abstract bool SendMail();
46
47
48 }
49 }
50 EmailYahoo.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace TemplateMethod
8 {
9 public class EmailYahoo:EmailBase
10 {
11
12 protected override bool CheckEmailAddress()
13 {
14 Console.WriteLine("Checking Email Address : YahooEmail");
15 return true;
16 }
17 protected override bool ValidateMessage()
18 {
19 Console.WriteLine("Validating Email Message : YahooEmail");
20 return true;
21 }
22
23
24 protected override bool SendMail()
25 {
26 Console.WriteLine("Semding Email : YahooEmail");
27 return true;
28 }
29
30
31 }
32 }
33 EmailGoogle.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace TemplateMethod
8 {
9 public class EmailGoogle:EmailBase
10 {
11
12 protected override bool CheckEmailAddress()
13 {
14 Console.WriteLine("Checking Email Address : GoogleEmail");
15 return true;
16 }
17 protected override bool ValidateMessage()
18 {
19 Console.WriteLine("Validating Email Message : GoogleEmail");
20 return true;
21 }
22
23
24 protected override bool SendMail()
25 {
26 Console.WriteLine("Semding Email : GoogleEmail");
27 return true;
28 }
29
30
31 }
32 }
33 Program.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace TemplateMethod
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 Console.WriteLine("Please choose an Email Account to send an Email:");
14 Console.WriteLine("Choose 1 for Google");
15 Console.WriteLine("Choose 2 for Yahoo");
16 string choice = Console.ReadLine();
17
18 if (choice == "1")
19 {
20 EmailBase email = new EmailGoogle(); // Rather than newing it up here, you may use a factory to do so.
21 email.SendEmail();
22
23 }
24 if (choice == "2")
25 {
26 EmailBase email = new EmailYahoo(); // Rather than newing it up here, you may use a factory to do so.
27 email.SendEmail();
28 }
29 }
30 }
31 }
32
Final Words:
It's very obvious that why the Template Method Pattern is a
popular pattern, everything at last revolves around Algorithms and if you are
clear with the steps involved it makes real sense to delegate the duty of
implementing the step's functionality to the sub classes.
Normal
0
false
false
false
EN-US
X-NONE
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin-top:0in;
mso-para-margin-right:0in;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0in;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;
mso-ligatures:standard;}