模板方法模式(Template Method Pattern)
1. 概述
模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤。模板方法模式通过将算法的固定部分放在抽象类中,而将可变的部分放在子类中实现,从而实现代码的复用和灵活性。
2. 适用场景
- 多个类有相同的行为逻辑:多个类有一些相同的逻辑,但是某些具体步骤可能有所不同。
- 避免代码重复:希望将公共的算法逻辑提取到一个地方,避免重复代码。
- 控制子类的扩展:不希望子类修改算法的结构,但允许子类修改某些具体步骤的实现。
3. 结构
- AbstractClass(抽象类):定义了一个模板方法,该方法包含了算法的骨架。模板方法通常由几个步骤组成,其中某些步骤是抽象的,由子类实现。
- ConcreteClass(具体子类):实现抽象类中定义的抽象方法,提供算法的具体步骤。
4. 示例代码
假设我们有一个制作饮料的系统,制作饮料的步骤包括:烧水、冲泡、倒入杯中、加入配料。不同的饮料可能在冲泡和加入配料的步骤有所不同。我们可以使用模板方法模式来实现这一需求。
1. 定义抽象类
abstract class Beverage {
// 模板方法,定义了制作饮料的步骤
public final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
// 具体方法:烧水
private void boilWater() {
System.out.println("Boiling water");
}
// 抽象方法:冲泡
protected abstract void brew();
// 具体方法:倒入杯中
private void pourInCup() {
System.out.println("Pouring into cup");
}
// 抽象方法:加入配料
protected abstract void addCondiments();
}
2. 实现具体子类
class Tea extends Beverage {
@Override
protected void brew() {
System.out.println("Steeping the tea");
}
@Override
protected void addCondiments() {
System.out.println("Adding lemon");
}
}
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");
}
}
3. 使用模板方法模式的客户端
public class TemplateMethodPatternDemo {
public static void main(String[] args) {
Beverage tea = new Tea();
tea.prepareRecipe();
System.out.println("---------");
Beverage coffee = new Coffee();
coffee.prepareRecipe();
}
}
5. 运行结果
Boiling water
Steeping the tea
Pouring into cup
Adding lemon
---------
Boiling water
Dripping coffee through filter
Pouring into cup
Adding sugar and milk
6. 分析
- 固定算法骨架:模板方法模式通过模板方法固定了算法的骨架,确保算法的整体结构不被改变。
- 子类定义可变步骤:子类通过实现抽象方法来定义算法的具体步骤,从而实现算法的灵活性。
7. 优缺点
-
优点:
- 代码复用:模板方法模式通过将公共的算法逻辑提取到抽象类中,减少了代码的重复,提高了代码的复用性。
- 算法的灵活性:子类可以通过实现抽象方法来定义具体的算法步骤,允许在不改变算法整体结构的情况下修改某些步骤的实现。
- 控制算法的扩展:模板方法模式通过将算法的骨架固定在抽象类中,确保了算法的整体结构不会被子类修改。
-
缺点:
- 增加类的数量:模板方法模式要求为每个不同的算法步骤创建一个子类,这可能会导致类的数量增加。
- 难以维护:如果算法的步骤非常复杂,模板方法模式可能会导致子类的继承关系变得复杂,难以维护。
8. 适用场景扩展
- 数据处理流程:在数据处理系统中,可以使用模板方法模式来定义数据处理的通用流程,如数据读取、数据处理、数据输出等步骤。
- 报表生成:在报表生成系统中,可以使用模板方法模式来定义报表生成的通用流程,如数据获取、数据格式化、报表输出等步骤。
- 游戏开发:在游戏开发中,可以使用模板方法模式来定义游戏的初始化、游戏逻辑处理、游戏结束等步骤。
模板方法模式通过将算法的固定部分放在抽象类中,而将可变的部分放在子类中实现,既实现了代码的复用,又提供了算法的灵活性。这种模式在算法逻辑固定但某些步骤需要灵活处理的场景中非常有用。