1. 基本概念

模板方法模式(Template Method Pattern)是一种行为型设计模式, 它定义了一个算法的骨架,将一些步骤的实现延迟到子类。模板方法模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。【引用自大话设计第10章】

举个简单的例子,做一道菜通常都需要包含至少三步:

  • 准备食材
  • 亨饪过程
  • 上菜

不同菜品的亨饪过程是不一样的,但是我们可以先定义一个”骨架”,包含这三个步骤,亨饪过程的过程放到具体的炒菜类中去实现,这样,无论炒什么菜,都可以沿用相同的炒菜算法,只需在子类中实现具体的炒菜步骤,从而提高了代码的复用性。

2. 基本结构

模板方法模式的基本结构包含以下两个角色:

image-20240518220339262

  • 模板类AbstractClass:由一个模板方法和若干个基本方法构成,模板方法定义了逻辑的骨架,按照顺序调用包含的基本方法,基本方法通常是一些抽象方法,这些方法由子类去实现。基本方法还包含一些具体方法,它们是算法的一部分但已经有默认实现,在具体子类中可以继承或者重写。
  • 具体类ConcreteClass:继承自模板类,实现了在模板类中定义的抽象方法,以完成算法中特定步骤的具体实现。

3. 简易实现

模板方法模式的简单示例如下:

  1. 定义模板类,包含模板方法,定义了算法的骨架, 一般都加上final关键字,避免子类重写。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 模板类
abstract class AbstractClass {
// 模板方法,定义了算法的骨架
public final void templateMethod() {
step1();
step2();
step3();
}

// 抽象方法,由子类实现
protected abstract void step1();
protected abstract void step2();
protected abstract void step3();
}
  1. 定义具体类, 实现模板类中的抽象方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 具体类
class ConcreteClass extends AbstractClass {
@Override
protected void step1() {
System.out.println("Step 1 ");
}

@Override
protected void step2() {
System.out.println("Step 2 ");
}

@Override
protected void step3() {
System.out.println("Step 3");
}
}
  1. 客户端实现
1
2
3
4
5
6
7
public class Main {
public static void main(String[] args) {
AbstractClass concreteTemplate = new ConcreteClass();
// 触发整个算法的执行
concreteTemplate.templateMethod();
}
}

4. 应用场景

模板方法模式将算法的不变部分被封装在模板方法中,而可变部分算法由子类继承实现,这样做可以很好的提高代码的复用性,但是当算法的框架发生变化时,可能需要修改模板类,这也会影响到所有的子类。

总体来说,当算法的整体步骤很固定,但是个别步骤在更详细的层次上的实现可能不同时,通常考虑模板方法模式来处理。在已有的工具和库中, Spring框架中的JdbcTemplate类使用了模板方法模式,其中定义了一些执行数据库操作的模板方法,具体的数据库操作由回调函数提供。而在Java的JDK源码中,AbstractList 类也使用了模板方法模式,它提供了一些通用的方法,其中包括一些模板方法。具体的列表操作由子类实现。


本站由 卡卡龙 使用 Stellar 1.29.1主题创建

本站访问量 次. 本文阅读量 次.