定义
模板方法模式是一种行为设计模式,它在一个方法中定义了一个算法的骨架,并将一些步骤延迟到子类中实现。通过这种方式,模板方法允许子类在不改变算法结构的情况下重新定义算法中的某些特定步骤。
UML图
组成角色
- AbstractClass(抽象类):
定义模板方法,包含算法的基本框架。它可能包含一些基本实现或抽象方法,供子类实现。 - ConcreteClass(具体类):
实现抽象类中的抽象方法,并可能覆盖模板方法中的某些步骤。具体类提供算法的具体实现。 - templateMethod(模板方法):
定义算法的骨架,调用各个步骤的方法。
代码
// AbstractClass
abstract class CaffeineBeverage {
// 模板方法
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
// 基本方法
void boilWater() {
System.out.println("Boiling water");
}
// 抽象方法,子类必须实现
abstract void brew();
// 基本方法
void pourInCup() {
System.out.println("Pouring into cup");
}
// 抽象方法,子类可以选择实现
abstract void addCondiments();
}
// ConcreteClass1
class Coffee extends CaffeineBeverage {
@Override
void brew() {
System.out.println("Dripping coffee through filter");
}
@Override
void addCondiments() {
System.out.println("Adding sugar and milk");
}
}
// ConcreteClass2
class Tea extends CaffeineBeverage {
@Override
void brew() {
System.out.println("Steeping the tea");
}
@Override
void addCondiments() {
System.out.println("Adding lemon");
}
}
// Client code
public class TemplateMethodDemo {
public static void main(String[] args) {
CaffeineBeverage coffee = new Coffee();
coffee.prepareRecipe();
System.out.println();
CaffeineBeverage tea = new Tea();
tea.prepareRecipe();
}
}
优点
- 代码复用:将算法的公共部分放在抽象类中,提高了代码的复用性。
- 灵活性:子类可以自由扩展或修改算法的某些部分,而不需要修改整个算法。
- 清晰性:算法的结构在模板方法中清晰可见,易于理解。
缺点
- 不灵活:子类必须遵循模板方法定义的算法结构,可能导致不必要的复杂性。
- 类的数量增加:随着算法的扩展,可能会导致类的数量增加,从而增加管理的复杂性。
使用场景
- 当有多个子类需要重用相同的算法时。
- 当需要在不改变算法结构的前提下扩展算法时。
- 当算法的步骤可以由不同的子类实现,但整体流程是固定的时。