模板方法在一个方法里定义了一套算法的骨架, 算法的某些步骤可以让子类来实现. 模板方法让子类重新定义算法的某些步骤而无需改变算法的结构.
类图:
这个抽象类:
针对这个抽象类, 我们可以有一些扩展:
看这个hook方法, 它是一个具体的方法, 但是啥也没做, 这种就叫做钩子方法. 子类可以重写该方法, 也可以不重写.
模板方法里面的钩子所谓的钩子, 它是一个在抽象类里面声明的方法, 但是方法里面默认的实现是空的. 这也就给了子类"钩进"算法某个点的能力, 当然子类也可以不这么做, 就看子类是否需要了.
看这个带钩子的饮料父类:
customerWantsCondiments()就是钩子, 子类可以重写它.
在prepareRecipe()方法里面, 通过这个钩子方法的结果来决定是否添加调料.
下面是使用这个钩子的咖啡:
C#代码实现 不带钩子的父类:using System; namespace TemplateMethodPattern.Abstractions { public abstract class CaffeineBeverage { public void PrepareRecipe() { BoilWater(); Brew(); PourInCup(); AddCondiments(); } protected void BoilWater() { Console.WriteLine("Boiling water"); } protected abstract void Brew(); protected void PourInCup() { Console.WriteLine("Pouring into cup"); } protected abstract void AddCondiments(); } }