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

相关推荐
兮℡檬,13 分钟前
答题卡识别判卷
开发语言·python·计算机视觉
酉鬼女又兒15 分钟前
零基础快速入门前端DOM 操作核心知识与实战解析(完整汇总版)(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·职场和发展·蓝桥杯·js
kyle~22 分钟前
C++----函数指针与函数指针类型 返回值类型 (*类型名)(参数列表)
开发语言·c++
zdl68633 分钟前
Spring Boot文件上传
java·spring boot·后端
世界哪有真情36 分钟前
哇!绝了!原来这么简单!我的 Java 项目代码终于被 “拯救” 了!
java·后端
RMB Player37 分钟前
Spring Boot 集成飞书推送超详细教程:文本消息、签名校验、封装工具类一篇搞定
java·网络·spring boot·后端·spring·飞书
努力中的编程者38 分钟前
二叉树(C语言底层实现)
c语言·开发语言·数据结构·c++·算法
重庆小透明43 分钟前
【搞定面试之mysql】第三篇 mysql的锁
java·后端·mysql·面试·职场和发展
大尚来也1 小时前
PHP 反序列化漏洞深度解析:从原理利用到 allowed_classes 防御实战
android·开发语言·php
RuoyiOffice1 小时前
企业请假销假系统设计实战:一张表、一套流程、两段生命周期——BPM节点驱动的表单变形术
java·spring·uni-app·vue·产品运营·ruoyi·anti-design-vue