模板方法模式 是一种行为型设计模式,它定义了一个算法的骨架,并将一些步骤延迟到子类中实现。
抽象类在模板方法模式中的作用:
-
定义算法骨架: 抽象类定义了算法的整体流程,包含一些具体方法和抽象方法。
- 具体方法:在抽象类中实现,通常代表算法中不变的步骤,例如初始化、资源释放等。
- 抽象方法:只声明方法签名,没有方法体,需要在子类中实现,代表算法中可变的步骤。
-
提供通用框架: 抽象类为子类提供了一个通用的框架,子类只需要实现抽象方法,就可以定制算法的具体步骤。
-
控制算法流程: 抽象类中的模板方法(通常是
final
的)控制了算法的执行顺序,确保所有子类都按照相同的流程执行算法。
示例:
假设我们要开发一个制作咖啡的流程,包括煮咖啡、加糖、加奶等步骤。我们可以使用模板方法模式来实现这个流程:
abstract class CoffeeMaker {
// 模板方法
public final void makeCoffee() {
boilWater();
brewCoffee();
pourInCup();
addSugar();
addMilk();
}
// 抽象方法
protected abstract void brewCoffee();
// 具体方法
private void boilWater() {
System.out.println("Boiling water...");
}
private void pourInCup() {
System.out.println("Pouring coffee into cup...");
}
private void addSugar() {
System.out.println("Adding sugar...");
}
private void addMilk() {
System.out.println("Adding milk...");
}
}
class AmericanoMaker extends CoffeeMaker {
@Override
protected void brewCoffee() {
System.out.println("Brewing Americano...");
}
}
class LatteMaker extends CoffeeMaker {
@Override
protected void brewCoffee() {
System.out.println("Brewing Latte...");
}
}
public class Main {
public static void main(String[] args) {
CoffeeMaker americanoMaker = new AmericanoMaker();
americanoMaker.makeCoffee();
System.out.println("-----------");
CoffeeMaker latteMaker = new LatteMaker();
latteMaker.makeCoffee();
}
}
输出:
Boiling water...
Brewing Americano...
Pouring coffee into cup...
Adding sugar...
Adding milk...
-----------
Boiling water...
Brewing Latte...
Pouring coffee into cup...
Adding sugar...
Adding milk...
解释:
CoffeeMaker
抽象类定义了制作咖啡的流程,包含抽象方法brewCoffee()
和具体方法boilWater()
、pourInCup()
、addSugar()
、addMilk()
。AmericanoMaker
和LatteMaker
子类分别实现了brewCoffee()
方法,定制了不同的咖啡制作方式。- 通过模板方法
makeCoffee()
,我们可以使用不同的子类来制作不同的咖啡,而无需修改makeCoffee()
方法的代码。