模板方法模式(Template Method Pattern)是一种行为设计模式,它在一个方法中定义一个算法的骨架,将一些步骤的实现延迟到子类中。通过这种方式,模板方法允许子类在不改变算法结构的情况下重新定义算法的某些特定步骤。
模板方法模式主要涉及两个角色:
- 抽象类(Abstract Class):定义模板方法和算法的骨架。模板方法一般是一个不可变的方法,它由一系列方法调用组成,包括抽象方法和钩子(hook)方法。
- 具体类(Concrete Class):实现抽象类中定义的抽象方法,以完成算法中与特定子类相关的步骤。
如何实现模板方法模式
以下是在 Java 中实现模板方法模式的步骤和示例。
- 定义抽象类:
1public abstract class AbstractClass {
2 // 模板方法,定义算法的骨架
3 public final void templateMethod() {
4 baseOperation1();
5 requiredOperation1();
6 baseOperation2();
7 hook();
8 requiredOperation2();
9 }
10
11 // 基本操作,已经有了实现
12 protected void baseOperation1() {
13 System.out.println("基本操作1");
14 }
15
16 // 基本操作,已经有了实现
17 protected void baseOperation2() {
18 System.out.println("基本操作2");
19 }
20
21 // 抽象操作,由子类实现
22 protected abstract void requiredOperation1();
23
24 // 抽象操作,由子类实现
25 protected abstract void requiredOperation2();
26
27 // 钩子方法,子类可以视情况决定是否覆盖它
28 protected void hook() {}
29}
- 创建具体子类:
1public class ConcreteClass extends AbstractClass {
2 @Override
3 protected void requiredOperation1() {
4 System.out.println("具体类实现的操作1");
5 }
6
7 @Override
8 protected void requiredOperation2() {
9 System.out.println("具体类实现的操作2");
10 }
11
12 @Override
13 protected void hook() {
14 System.out.println("具体类覆盖了钩子方法");
15 }
16}
- 客户端使用模板方法:
1public class Demo {
2 public static void main(String[] args) {
3 AbstractClass abstractClass = new ConcreteClass();
4 // 调用模板方法,它会按照定义的顺序执行算法步骤
5 abstractClass.templateMethod();
6 }
7}
在这个例子中,AbstractClass 定义了一个名为 templateMethod 的方法,它是一个算法的骨架。这个方法按特定的顺序调用了其他的方法,其中一些方法是抽象的(requiredOperation1 和 requiredOperation2),必须由子类提供实现。还有一些方法是具体的(baseOperation1 和 baseOperation2),在抽象类中实现,子类可以直接使用。最后,有一个钩子方法(hook),子类可以视情况覆盖它以影响算法的流程。