不管是我们学习并发编程中的 AQS,还是看 Spring 的源码,肯定都会遇到模板方法模式,它简直太常见了。
前言
模板,顾名思义,它是一个固定化、标准化的东西。
模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。
场景问题
程序员不愿多扯,上来先干两行代码
网上模板方法的场景示例特别多,个人感觉还是《Head First 设计模式》中的例子比较好。
假设我们是一家饮品店的师傅,起码需要以下两个手艺
真简单哈,这么看,步骤大同小异,我的第一反应就是写个业务接口,不同的饮品实现其中的方法就行,像这样
画完类图,猛地发现,第一步和第三步没什么差别,而且做饮品是个流程式的工作,我希望使用时,直接调用一个方法,就去执行对应的制作步骤。
灵机一动,不用接口了,用一个抽象父类,把步骤方法放在一个大的流程方法 makingDrinks()
中,且第一步和第三步,完全一样,没必要在子类实现,改进如下
再看下我们的设计,感觉还不错,现在用同一个 makingDrinks()
方法来处理咖啡和茶的制作,而且我们不希望子类覆盖这个方法,所以可以申明为 final,不同的制作步骤,我们希望子类来提供,必须在父类申明为抽象方法,而第一步和第三步我们不希望子类重写,所以我们声明为非抽象方法
public abstract class Drinks {
void boilWater() {
System.out.println("将水煮沸");
}
abstract void brew();
void pourInCup() {
System.out.println("倒入杯子");
}
abstract void addCondiments();
public final void makingDrinks() {
//热水
boilWater();
//冲泡
brew();
//倒进杯子
pourInCup();
//加料
addCondiments();
}
}
接着&#