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

相关推荐
guojl5 分钟前
Java多任务编排技术
java
丶意冷13 分钟前
mybatisPlus分页方言设置错误问题 mybatisPlus对于Oceanbase的Oracle租户分页识别错误
java·数据库·oracle·oceanbase
king_harry13 分钟前
Java程序-OceanBase Connector/J 示例
开发语言
要开心吖ZSH39 分钟前
《Spring 中上下文传递的那些事儿》Part 4:分布式链路追踪 —— Sleuth + Zipkin 实践
java·分布式·spring
桦说编程1 小时前
深入解析CompletableFuture源码实现
java·性能优化·源码
傻啦嘿哟1 小时前
Python 办公实战:用 python-docx 自动生成 Word 文档
开发语言·c#
翻滚吧键盘1 小时前
js代码09
开发语言·javascript·ecmascript
q567315231 小时前
R语言初学者爬虫简单模板
开发语言·爬虫·r语言·iphone
蓝澈11212 小时前
迪杰斯特拉算法之解决单源最短路径问题
java·数据结构
Kali_072 小时前
使用 Mathematical_Expression 从零开始实现数学题目的作答小游戏【可复制代码】
java·人工智能·免费