模板方法模式——在一个抽象类中定义一个操作中的算法骨架(对应于生活中的大家下载的模板),而将一些步骤延迟到子类中去实现(对应于我们根据自己的情况向模板填充内容)。模板方法使得子类可以不改变一个算法的结构前提下,重新定义算法的某些特定步骤,模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码。
/// <summary>
/// 抽象类
/// </summary>
public abstract class AbstractClass
{
    // 一些抽象行为,放到子类去实现
    public abstract void PrimitiveOperation1();
    public abstract void PrimitiveOperation2();
    /// <summary>
    /// 模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,它们推迟到子类去实现。
    /// </summary>
    public void TemplateMethod()
    {
        PrimitiveOperation1();
        PrimitiveOperation2();
        Console.WriteLine("Done the method.");
    }
}
/// <summary>
/// 具体类,实现了抽象类中的特定步骤
/// </summary>
public class ConcreteClassA : AbstractClass
{
    /// <summary>
    /// 与ConcreteClassB中的实现逻辑不同
    /// </summary>
    public override void PrimitiveOperation1()
    {
        Console.WriteLine("Implement operation 1 in Concreate class A.");
    }
    /// <summary>
    /// 与ConcreteClassB中的实现逻辑不同
    /// </summary>
    public override void PrimitiveOperation2()
    {
        Console.WriteLine("Implement operation 2 in Concreate class A.");
    }
}
/// <summary>
/// 具体类,实现了抽象类中的特定步骤
/// </summary>
public class ConcreteClassB : AbstractClass
{
    /// <summary>
    /// 与ConcreteClassA中的实现逻辑不同
    /// </summary>
    public override void PrimitiveOperation1()
    {
        Console.WriteLine("Implement operation 1 in Concreate class B.");
    }
    /// <summary>
    /// 与ConcreteClassA中的实现逻辑不同
    /// </summary>
    public override void PrimitiveOperation2()
    {
        Console.WriteLine("Implement operation 2 in Concreate class B.");
    }
}
/// <summary>
/// 调用
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
    // 声明抽象类
    AbstractClass ac;
    // 用ConcreteClassA实例化ac
    ac = new ConcreteClassA();
    ac.TemplateMethod();
    // 用ConcreteClassB实例化ac
    ac = new ConcreteClassB();
    ac.TemplateMethod();
    Console.ReadLine();
}
把相同的部分抽象出来到抽象类中去定义,具体子类来实现具体的不同部分,这个思路也正式模板方法的实现精髓所在。
优点:
缺点: 因为引入了一个抽象类,如果具体实现过多的话,需要用户或开发人员需要花更多的时间去理清类之间的关系。
在以下情况下可以考虑使用模板方法模式:
原文:http://www.cnblogs.com/snaildev/p/7667461.html