4.10 模板方法模式 (Template Method)

模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些步骤。

主要角色

  1. AbstractClass(抽象类): 定义了一个模板方法和一些抽象操作。
  2. 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
    }
}

使用场景

模板方法模式适用于以下场景:

  1. 算法的整体结构固定: 但某些具体步骤可以由子类实现。
  2. 代码复用: 通过模板方法复用相同的算法结构代码。
  3. 控制子类扩展: 通过模板方法模式,可以在抽象类中控制算法的执行顺序,而将可变的部分交给子类实现。

优缺点

优点:

  1. 代码复用: 提取了公共代码,减少了代码重复。
  2. 灵活性: 子类可以实现具体的步骤,增加了算法的灵活性。
  3. 控制反转: 通过模板方法模式,父类控制子类的行为,符合“好莱坞原则”(不要调用我们,我们会调用你)。

缺点:

  1. 类的数量增加: 每个具体实现都需要定义一个子类,可能导致类的数量增加。
  2. 难以维护: 如果算法步骤过多,模板方法过于复杂,可能导致代码难以维护。

模板方法模式通过定义一个算法的骨架,并将具体的步骤延迟到子类中,使得算法的结构和实现细节分离,提高了代码的复用性和灵活性。它在需要复用算法结构但允许某些步骤变化的场景中非常有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值