模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
主要角色
- 抽象类(Abstract Class):定义了一个模板方法和若干个抽象方法。模板方法按特定的顺序调用这些抽象方法。
- 具体类(Concrete Class):实现了抽象类中的抽象方法。具体类并不改变模板方法的结构,而是通过实现具体步骤来影响整个算法的行为。
优点
- 复用代码:公共的逻辑在抽象类中实现,避免了代码重复。
- 灵活性:允许子类在不改变算法结构的前提下重写步骤。
- 易于维护:将算法的固定部分与可变部分分离,增强了代码的可读性和维护性。
示例
假设我们有一个制作饮料的算法,包括准备材料、加入配料、搅拌和倒入杯子。制作咖啡和茶的过程相似,但配料不同。我们可以使用模板方法模式来实现这个算法。
步骤1:定义抽象类
public abstract class Beverage {
// 模板方法
public final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
// 通用方法
private void boilWater() {
System.out.println("Boiling water");
}
private void pourInCup() {
System.out.println("Pouring into cup");
}
// 抽象方法,具体步骤由子类实现
protected abstract void brew();
protected abstract void addCondiments();
}
步骤2:实现具体类
// 具体类:咖啡
public class Coffee extends Beverage {
@Override
protected void brew() {
System.out.println("Dripping coffee through filter");
}
@Override
protected void addCondiments() {
System.out.println("Adding sugar and milk");
}
}
// 具体类:茶
public class Tea extends Beverage {
@Override
protected void brew() {
System.out.println("Steeping the tea");
}
@Override
protected void addCondiments() {
System.out.println("Adding lemon");
}
}
步骤3:测试模板方法模式
public class TemplateMethodPatternDemo {
public static void main(String[] args) {
Beverage coffee = new Coffee();
coffee.prepareRecipe();
System.out.println();
Beverage tea = new Tea();
tea.prepareRecipe();
}
}