定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
代表这些具体实现的方法同常称作基本方法(Primitive Method),而调用这些基本方法的方法叫做模板方法(Template Method)。
public abstract class BasicTax{
protected float income;//你的收入
public void ReportTax()
{
//计算一下你该给州政府交多少税
float sTax = calculateStateTax();
//计算一下你该给联邦政府交多少税
float fTax = calcualteFedTax();
//算算你破产没
bool ok = CheckBankBalance(sTax + fTax);
if(!ok)
{
//申请破产
FileBankruptcy();
}
else
{
//如果没破产就把税交上吧
SendMoneyToGov(sTax + fTax);
}
}
protected abstract float calculateStateTax();
protected abstract float calculateFedTax();
}
事实上,不同的州政府设定的税率或是计算方法有可能是不同的,联邦政府在某些时期对税率也会有所调整,所以BasicTax抽象类的创建者不必关心给个州的税率是如何的,也 不必关心联邦政府会在什么时候调整税率,他只要知道报税人要么报税要么申请破产就可以了,
BasicTax是个抽象类,你没有办法直接实例化它,你要做的就是创建一个继承自BasicTax的派生类,并实现caculateStateTax和caculateFedTax这两个抽象方法。











































从上面的代码中你可以看到,WashingtonTax和UltahTax分别为华盛顿州和犹他州报税方法提供了具体的实现






好了让我们来回顾一下,在BasicTax的例子中ReportTax其实就是一个模板方法,这个方法描述了报税时所要执行的步骤,却没有描述每一步是如何执行的,因为它所依赖的方法还没有实现。模板方法强调的是不同对象之间及方法之间如何协作。
在实际情况中,模板方法通常包含了业务领域知识,这些领域知识规定了不同方法是如何协作的;抽象方法为模板方法调用的方法提供了客户化实现的手段。
模板方法描述了特定操作步骤的骨架或是处理流程,而不是直接规定给个操作该如何执行,将抽象与具体分割开来,从而保证代码可以最大限度地被复用。