模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些步骤。
主要角色
- AbstractClass(抽象类): 定义了一个模板方法和一些抽象操作。
- ConcreteClass(具体类): 实现抽象操作以完成算法中可变的部分。
类图
+--------------------+
| AbstractClass |
+--------------------+
| + templateMethod() |
| + primitive1() |
| + primitive2() |
+--------------------+
^
|
+--------------------+
| ConcreteClass |
+--------------------+
| + primitive1() |
| + primitive2() |
+--------------------+
示例代码
以下是一个简单的模板方法模式实现示例,使用了 Java 语言:
// 抽象类
abstract class AbstractClass {
// 模板方法,定义了算法的骨架
public final void templateMethod() {
primitive1();
primitive2();
hook();
}
// 基本方法(抽象方法),由子类实现
protected abstract void primitive1();
protected abstract void primitive2();
// 钩子方法(可选的,可以由子类覆盖)
protected void hook() {
// 默认实现(可为空)
}
}
// 具体类A
class ConcreteClassA extends AbstractClass {
@Override
protected void primitive1() {
System.out.println("ConcreteClassA: primitive1");
}
@Override
protected void primitive2() {
System.out.println("ConcreteClassA: primitive2");
}
}
// 具体类B
class ConcreteClassB extends AbstractClass {
@Override
protected void primitive1() {
System.out.println("ConcreteClassB: primitive1");
}
@Override
protected void primitive2() {
System.out.println("ConcreteClassB: primitive2");
}
@Override
protected void hook() {
System.out.println("ConcreteClassB: hook");
}
}
// 使用示例
public class TemplateMethodPatternDemo {
public static void main(String[] args) {
AbstractClass classA = new ConcreteClassA();
classA.templateMethod();
// Output:
// ConcreteClassA: primitive1
// ConcreteClassA: primitive2
AbstractClass classB = new ConcreteClassB();
classB.templateMethod();
// Output:
// ConcreteClassB: primitive1
// ConcreteClassB: primitive2
// ConcreteClassB: hook
}
}
使用场景
模板方法模式适用于以下场景:
- 算法的整体结构固定: 但某些具体步骤可以由子类实现。
- 代码复用: 通过模板方法复用相同的算法结构代码。
- 控制子类扩展: 通过模板方法模式,可以在抽象类中控制算法的执行顺序,而将可变的部分交给子类实现。
优缺点
优点:
- 代码复用: 提取了公共代码,减少了代码重复。
- 灵活性: 子类可以实现具体的步骤,增加了算法的灵活性。
- 控制反转: 通过模板方法模式,父类控制子类的行为,符合“好莱坞原则”(不要调用我们,我们会调用你)。
缺点:
- 类的数量增加: 每个具体实现都需要定义一个子类,可能导致类的数量增加。
- 难以维护: 如果算法步骤过多,模板方法过于复杂,可能导致代码难以维护。
模板方法模式通过定义一个算法的骨架,并将具体的步骤延迟到子类中,使得算法的结构和实现细节分离,提高了代码的复用性和灵活性。它在需要复用算法结构但允许某些步骤变化的场景中非常有用。