模板方法模式(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. 灵活性降低:由于算法结构固定,无法动态地改变算法的流程。

相关推荐
铭哥的编程日记25 分钟前
《从C风格到C++风格:内存管理的进化之路》
开发语言·c++
Dcs26 分钟前
“SQL注入即服务”:一个10年历史系统的奇幻演变
java
秃了也弱了。29 分钟前
reflections:Java非常好用的反射工具包
java·开发语言
Amagi.1 小时前
Java设计模式-代理模式
java·代理模式
Joker—H2 小时前
【Java】Reflection反射(代理模式)
java·开发语言·经验分享·代理模式·idea
阿里巴巴淘系技术团队官网博客2 小时前
面向互联网2C业务的分布式类Manus Java框架
java·开发语言·分布式
躲在云朵里`3 小时前
Java面试题(中等)
java
懂得节能嘛.3 小时前
【SpringAI实战】实现仿DeepSeek页面对话机器人(支持多模态上传)
java·spring
张乔243 小时前
mybatisX的自定义模板生成
java·ide·intellij-idea
笨蛋不要掉眼泪3 小时前
Java测试题(上)
java·开发语言