模板方法模式(Template Method Pattern)

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

模板方法模式的核心组成部分:

  1. AbstractClass(抽象类)

    抽象类定义了算法的骨架,包含一个或多个抽象方法供子类实现,以及一个模板方法来定义算法的整体流程。

  2. 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

优点

  1. 代码复用:将公共的算法步骤提取到抽象类中,避免了重复代码。
  2. 扩展性强:子类可以通过实现抽象方法或覆盖默认方法来自定义算法的某些步骤。
  3. 封装不变性:模板方法封装了算法的整体结构,子类只需关注具体实现。

缺点

  1. 类数量增加:每种具体实现都需要一个具体类,可能会导致类的数量显著增加。
  2. 灵活性降低:由于算法结构固定,无法动态地改变算法的流程。

相关推荐
代码羊羊17 分钟前
rust-字符串(切片)、元组、结构体、枚举、数组
开发语言·后端·rust
sthnyph18 分钟前
TypeScript 与后端开发Node.js
java
逻辑驱动的ken20 分钟前
Java高频面试考点场景题08
java·开发语言·面试·求职招聘·春招
不恋水的雨27 分钟前
手动调用spring的@Validated校验
java·spring
xxjj998a36 分钟前
【Spring】Spring MVC案例
java·spring·mvc
W230357657343 分钟前
【改进版】C++ 固定线程池实现:基于调用者运行的拒绝策略优化
开发语言·c++·线程池
阿巴斯甜1 小时前
Android:MagicIndicator的使用
java
Nyarlathotep01131 小时前
并发集合类(1):CopyOnWriteArrayList
java·后端
千寻girling1 小时前
被内推的面试 , 第一次
java·前端·python·面试·职场和发展·typescript·node.js
星辰_mya1 小时前
PV之系统与并发的核心wu器
java·开发语言·后端·学习·面试·架构师