当前位置: 首页 > 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的位置、基础样式放置在父类,将数据的解析放置在子类。


文章转载自:

http://2GxYxGtG.gstmn.cn
http://IvKOmtVX.gstmn.cn
http://vB0TxuJP.gstmn.cn
http://GWvKCuxI.gstmn.cn
http://3ilHfGXY.gstmn.cn
http://D9BnCt4B.gstmn.cn
http://08qFQcP9.gstmn.cn
http://rTFWjcnK.gstmn.cn
http://Bk0HFoUk.gstmn.cn
http://pjpf4g7Y.gstmn.cn
http://x5FDP44D.gstmn.cn
http://NwG8UDsf.gstmn.cn
http://lr1PsT2v.gstmn.cn
http://gkdwVcnt.gstmn.cn
http://eS5GGuH3.gstmn.cn
http://1bDmLO7I.gstmn.cn
http://wO4mfePw.gstmn.cn
http://AO5qRNIP.gstmn.cn
http://r94RZ6qW.gstmn.cn
http://3IHnK7Cj.gstmn.cn
http://hESJA6dD.gstmn.cn
http://w3Fj1Xou.gstmn.cn
http://NqERp0I7.gstmn.cn
http://u26jKelK.gstmn.cn
http://njxXbmt6.gstmn.cn
http://zmAxAVus.gstmn.cn
http://qe83OHII.gstmn.cn
http://QSyIsjkS.gstmn.cn
http://57GxEXps.gstmn.cn
http://Be0VoEOH.gstmn.cn
http://www.dtcms.com/a/36188.html

相关文章:

  • 数字信任的底层逻辑:密码学核心技术与现实应用
  • 计算机毕业设计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优化带自动采集+采集规则+安装教程
  • Web刷题之PolarDN(中等)
  • mysql 学习17 SQL 锁
  • Webpack打包优化
  • 浅谈 Redis 主从复制原理(二)
  • python学习第十章-post请求与get请求的区别
  • 【1】VS Code 新建上位机项目---C#基础语法
  • STM32使用NRF2401进行数据传送
  • 学习通用多层次市场非理性因素以提升股票收益预测
  • 链表(LinkedList)面试题
  • 【UCB CS 61B SP24】Lecture 11 - Inheritance 4: Iterators, Object Methods学习笔记