定义:定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法模式包括以下角色:
AbstractClass(抽象类): 定义了一个或多个抽象操作,以便让子类实现。
ConcreteClass(具体子类): 实现父类所定义的一个或多个抽象方法。
举例
请人吃饭模板:点单、吃饭、结账
- 抽象类
public abstract class AbstractClass
{
//模板方法(定义了基本方法的执行次序)
public void TemplateMethod()
{
PrimitiveOperation_1();
PrimitiveOperation_2();
PrimitiveOperation_3();
}//基本方法-具体方法(直接在父类中实现)
public void PrimitiveOperation_1()
{
Console.WriteLine("点单");
}//基本方法-抽象方法(在子类中必须实现)
public abstract void PrimitiveOperation_2();//基本方法-钩子方法(在子类中选择实现)
public virtual void PrimitiveOperation_3() { }
}
- 具体子类
public class ConcreteClass : AbstractClass
{
public override void PrimitiveOperation_2()
{
Console.WriteLine("吃饭");
}//可选择是否重写来执行该操作
public override void PrimitiveOperation_3()
{
Console.WriteLine("结账");
}
}
- 客户类
static void Main(string[] args)
{
AbstractClass abstractClass = new ConcreteClass();
abstractClass.TemplateMethod();
}
总结:抽象类中首先定义模板方法,决定了基本方法的执行次序,同时可以选择各个基本方法的类型,具体方法直接在抽象类中实现,抽象方法留到子类中实现,钩子方法则在抽象类中空实现,以便子类自行选择是否实现。
ps:钩子方法还可通过“挂钩”方法来实现,则在模板方法中加个判断是否执行钩子方法,而这个判断可以在子类中决定。