当前位置: 首页 > news >正文

模板方法模式

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的骨架,允许子类在不改变算法结构的情况下重写某些步骤的具体实现。

核心思想

  1. 抽象类定义模板方法(final 修饰,防止子类修改算法流程)

  2. 模板方法中调用多个步骤方法(可以是抽象方法或具体方法)

  3. 具体子类实现特定的步骤方法

行为由父类控制,子类只负责实现,子类通过扩展父类,实现更灵活的操作,符合开闭原则。缺点就是导致类个数增多,增加系统复杂度


示例场景:制作饮料
假设我们需要实现咖啡和茶的制作流程,二者步骤类似但具体操作不同:

// 抽象类:定义饮料制作模板
abstract class Beverage {

    // 模板方法 (final 防止子类覆盖)
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    // 抽象方法:必须由子类实现
    protected abstract void brew();
    protected abstract void addCondiments();

    // 具体方法:通用步骤
    private void boilWater() {
        System.out.println("烧水");
    }

    private void pourInCup() {
        System.out.println("倒入杯子");
    }

    // 钩子方法:子类可选择是否覆盖(默认加调料)
    protected boolean customerWantsCondiments() {
        return true;
    }
}

// 具体实现:咖啡
class Coffee extends Beverage {
    @Override
    protected void brew() {
        System.out.println("冲泡咖啡粉");
    }

    @Override
    protected void addCondiments() {
        System.out.println("加糖和牛奶");
    }

    // 覆盖钩子方法:不要调料
    @Override
    protected boolean customerWantsCondiments() {
        return false;
    }
}

// 具体实现:茶
class Tea extends Beverage {
    @Override
    protected void brew() {
        System.out.println("浸泡茶叶");
    }

    @Override
    protected void addCondiments() {
        System.out.println("加柠檬");
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        Beverage coffee = new Coffee();
        coffee.prepareRecipe();
        /* 输出:
           烧水
           冲泡咖啡粉
           倒入杯子
        */

        Beverage tea = new Tea();
        tea.prepareRecipe();
        /* 输出:
           烧水
           浸泡茶叶
           倒入杯子
           加柠檬
        */
    }
}

关键点解析

  • 模板方法:prepareRecipe() 定义了算法骨架

  • 必须实现的步骤:brew()addCondiments() 是抽象方法

  • 可选覆盖的钩子方法:customerWantsCondiments() 提供扩展点

  • 代码复用:通用步骤(boilWater()pourInCup())在父类实现


应用场景

  • 多个类有相似算法流程,但部分步骤不同

  • 需要控制子类扩展的粒度(如:不允许修改算法顺序)

  • 框架中定义操作流程(如:Spring 的 JdbcTemplate)

  • 该模式通过封装不变部分、扩展可变部分,实现了代码复用与灵活扩展的平衡。

例如:生成PDF模板,有固定的logo位置、固定的表格排版,不固定的就是数据的解析,可以将logo的位置、基础样式放置在父类,将数据的解析放置在子类。

相关文章:

  • 数字信任的底层逻辑:密码学核心技术与现实应用
  • 计算机毕业设计SpringBoot+Vue.js墙绘产品展示交易平台(源码+文档+PPT+讲解)
  • [AI]从零开始的树莓派运行DeepSeek模型教程
  • C#开发——ConcurrentDictionary集合
  • 华为认证考试证书下载步骤(纸质+电子版)
  • docker安装register私库
  • 详解golang的Gengine规则引擎
  • 【排序算法】堆排序详解
  • 基于 SpringBoot 的 “电影交流平台小程序” 系统的设计与实现
  • 推送项目 之 解决冲突
  • Claude 3.7 Sonnet 泄露,Anthropic 最先进 AI 模型即将在 AWS Bedrock 上首次亮相
  • 【NLP 26、实践 ⑥ 引入bert,判断文本中是否有特定字符出现】
  • 深入理解 Redis 设计与集群管理
  • JavaSE学习笔记26-集合(Collection)
  • Unity百游修炼(1)——FootBall详细制作全流程
  • 大模型语料库的构建过程 包括知识图谱构建 垂直知识图谱构建 输入到sql构建 输入到cypher构建 通过智能体管理数据生产组件
  • 【前端基础】Day 1 HTML
  • 【Qt】桌面应用开发 ------ 绘图事件和绘图设备 文件操作
  • 渗透小记--Docker Registry未授权访问
  • PHP_最新版PTCMS小说聚合网站系统源码+会员收费机制+深度SEO优化带自动采集+采集规则+安装教程
  • 有什么可以做兼职的网站吗/seo工作是什么意思
  • 个人可以架设网站吗/百度推广一般多少钱
  • 开发一个手机系统有多难/苏州网站seo服务
  • 利用小说网站做本站优化/seo排名赚app靠谱吗
  • 什么网站做hevc/获客引流100种方法
  • 国内做交互网站/电商平台怎么推广