1. 概念
模板方法模式是一种行为设计模式,它通过定义一个算法的骨架,而将一些步骤延迟到子类中实现,从而使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。这种模式促进了代码的重用和扩展性。
在模板方法模式中,通常有一个抽象类定义了一个模板方法,该方法定义了算法的骨架,并且在其中调用了一系列的抽象方法或者具体方法,这些方法可以由子类实现以完成算法的特定步骤。子类可以根据需要选择性地覆盖这些方法,以实现自己的行为,但是算法的结构保持不变。
举个例子,假设我们有一个制作饮料的模板方法。算法包括准备材料、加工和装饰。具体的饮料(如咖啡、茶等)可以通过继承这个模板方法来实现自己的制作过程,比如咖啡可以覆盖加工过程中的研磨咖啡豆这一步骤,而茶可以覆盖加工过程中的浸泡茶叶这一步骤。
模板方法模式的优点包括促进代码重用、提高了代码的扩展性、隐藏了算法的实现细节。但是它也有一些缺点,比如在复杂的情况下,可能会导致类的层次结构变得复杂,以及子类需要实现的抽象方法过多可能会增加维护成本。
2. 示例
以制作咖啡为例,定义一个抽象类 CoffeeTemplate
,其中包含制作咖啡的模板方法 prepareCoffee()
,以及一些具体的步骤方法。然后,创建两个具体的子类来实现这些步骤。
// 抽象类:咖啡模板
abstract class CoffeeTemplate {
// 制作咖啡的模板方法,定义了制作咖啡的流程
public final void prepareCoffee() {
boilWater();
brewCoffeeGrinds();
pourInCup();
addCondiments();
}
// 抽象方法:烧水
abstract void boilWater();
// 抽象方法:冲泡咖啡
abstract void brewCoffeeGrinds();
// 具体方法:倒入杯中
void pourInCup() {
System.out.println("倒入杯中");
}
// 具体方法:加入调料
void addCondiments() {
System.out.println("加入糖和牛奶");
}
}
// 具体类:制作黑咖啡
class BlackCoffee extends CoffeeTemplate {
@Override
void boilWater() {
System.out.println("煮沸水");
}
@Override
void brewCoffeeGrinds() {
System.out.println("冲泡黑咖啡");
}
}
// 具体类:制作拿铁咖啡
class LatteCoffee extends CoffeeTemplate {
@Override
void boilWater() {
System.out.println("煮沸水");
}
@Override
void brewCoffeeGrinds() {
System.out.println("冲泡拿铁咖啡");
}
@Override
void addCondiments() {
System.out.println("加入牛奶泡沫");
}
}
public class Main {
public static void main(String[] args) {
System.out.println("制作黑咖啡:");
CoffeeTemplate blackCoffee = new BlackCoffee();
blackCoffee.prepareCoffee();
System.out.println("\n制作拿铁咖啡:");
CoffeeTemplate latteCoffee = new LatteCoffee();
latteCoffee.prepareCoffee();
}
}
在这个示例中,CoffeeTemplate
是一个抽象类,定义了制作咖啡的模板方法 prepareCoffee()
,以及具体的步骤方法。BlackCoffee
和 LatteCoffee
是两个具体的子类,分别实现了煮沸水和冲泡咖啡这两个抽象方法,而 LatteCoffee
还覆盖了加入调料这个具体方法。通过调用 prepareCoffee()
方法,我们可以制作不同种类的咖啡,而具体的步骤由子类来实现。