模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的框架,并将一些步骤的实现延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些特定步骤。
模板方法模式的核心组成部分:
-
AbstractClass(抽象类)
抽象类定义了算法的骨架,包含一个或多个抽象方法供子类实现,以及一个模板方法来定义算法的整体流程。
-
ConcreteClass(具体类)
具体类实现了抽象类中的抽象方法,提供了具体的实现细节。
模板方法模式的应用场景
- 多步骤算法:如制作饮料的流程(烧水、冲泡、倒入杯中、加调料等),不同饮料的具体实现可能有所不同。
- 框架开发:在框架中定义通用的流程,允许开发者通过继承和重写部分方法来自定义行为。
- 游戏开发:如游戏关卡的设计,每个关卡的初始化、运行逻辑和结束逻辑可以由子类实现。
- 数据处理:如读取文件、解析数据、处理数据、保存结果等,每一步都可以有不同的实现。
示例代码(Java)
以下是一个简单的模板方法模式实现示例:
java
// 抽象类
abstract class AbstractClass {
// 模板方法,定义了算法的整体流程
public final void templateMethod() {
step1();
step2();
step3();
}
// 抽象方法,由子类实现
protected abstract void step1();
// 抽象方法,由子类实现
protected abstract void step2();
// 默认实现的方法,子类可以选择覆盖
protected void step3() {
System.out.println("默认的步骤 3");
}
}
// 具体类A
class ConcreteClassA extends AbstractClass {
@Override
protected void step1() {
System.out.println("ConcreteClassA: 实现步骤 1");
}
@Override
protected void step2() {
System.out.println("ConcreteClassA: 实现步骤 2");
}
}
// 具体类B
class ConcreteClassB extends AbstractClass {
@Override
protected void step1() {
System.out.println("ConcreteClassB: 实现步骤 1");
}
@Override
protected void step2() {
System.out.println("ConcreteClassB: 实现步骤 2");
}
@Override
protected void step3() {
System.out.println("ConcreteClassB: 覆盖默认的步骤 3");
}
}
// 测试模板方法模式
public class TemplateMethodPatternDemo {
public static void main(String[] args) {
AbstractClass templateA = new ConcreteClassA();
System.out.println("运行 ConcreteClassA 的模板方法:");
templateA.templateMethod();
System.out.println();
AbstractClass templateB = new ConcreteClassB();
System.out.println("运行 ConcreteClassB 的模板方法:");
templateB.templateMethod();
}
}
输出结果
运行 ConcreteClassA 的模板方法:
ConcreteClassA: 实现步骤 1
ConcreteClassA: 实现步骤 2
默认的步骤 3
运行 ConcreteClassB 的模板方法:
ConcreteClassB: 实现步骤 1
ConcreteClassB: 实现步骤 2
ConcreteClassB: 覆盖默认的步骤 3
优点
- 代码复用:将公共的算法步骤提取到抽象类中,避免了重复代码。
- 扩展性强:子类可以通过实现抽象方法或覆盖默认方法来自定义算法的某些步骤。
- 封装不变性:模板方法封装了算法的整体结构,子类只需关注具体实现。
缺点
- 类数量增加:每种具体实现都需要一个具体类,可能会导致类的数量显著增加。
- 灵活性降低:由于算法结构固定,无法动态地改变算法的流程。