李锋镝的博客

  • 首页
  • 时间轴
  • 左邻右舍
  • 关于我
    • 关于我
    • 另一个网站
    • 我的导航站
    • 网站地图
    • 赞助
    • 博友圈
  • 说说
  • 走心评论
  • 互动榜
  • 留言
  • 🚇开往
Destiny
自是人生长恨水长东
  1. 首页
  2. 后端
  3. 正文

Java设计模式:模板方法模式

2025年5月21日 332点热度 0人点赞 0条评论

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

核心概念

  1. 抽象类(Abstract Class)

    • 定义算法的骨架(模板方法),包含多个步骤的方法调用。
    • 部分步骤方法可以是抽象的(由子类实现),也可以有默认实现。
  2. 具体子类(Concrete Subclass)

    • 实现抽象类中的抽象方法,完成算法的特定步骤。

适用场景

  • 多个子类有共同的算法结构,但部分步骤实现不同。
  • 避免代码重复,将通用部分提取到父类,特殊部分由子类实现。
  • 控制子类扩展点,只允许在特定步骤进行修改。

示例代码

假设我们要实现一个冲泡饮品的流程,包含烧水、冲泡、倒入杯子、添加配料四个步骤。其中“冲泡”和“添加配料”因饮品而异。

// 抽象类:定义冲泡饮品的模板
abstract class BeverageMaker {
    // 模板方法:定义算法骨架,不可被重写
    public final void prepareBeverage() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    // 通用步骤:默认实现
    private void boilWater() {
        System.out.println("烧开水");
    }

    // 抽象步骤:由子类实现
    protected abstract void brew();

    // 通用步骤:默认实现
    private void pourInCup() {
        System.out.println("倒入杯子");
    }

    // 抽象步骤:由子类实现
    protected abstract void addCondiments();

    // 钩子方法:子类可选择性覆盖
    protected boolean customerWantsCondiments() {
        return true;
    }
}

// 具体子类:咖啡
class CoffeeMaker extends BeverageMaker {
    @Override
    protected void brew() {
        System.out.println("用沸水冲泡咖啡");
    }

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

// 具体子类:茶
class TeaMaker extends BeverageMaker {
    @Override
    protected void brew() {
        System.out.println("用沸水浸泡茶叶");
    }

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

    // 覆盖钩子方法,控制是否添加配料
    @Override
    protected boolean customerWantsCondiments() {
        return false;
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        BeverageMaker coffee = new CoffeeMaker();
        coffee.prepareBeverage();

        System.out.println("\n=====\n");

        BeverageMaker tea = new TeaMaker();
        tea.prepareBeverage();
    }
}

代码解释

  1. 抽象类 BeverageMaker

    • prepareBeverage():模板方法,定义了冲泡饮品的完整流程。
    • brew() 和 addCondiments():抽象方法,由子类实现。
    • customerWantsCondiments():钩子方法(Hook Method),允许子类控制算法的某个步骤是否执行。
  2. 具体子类 CoffeeMaker 和 TeaMaker

    • 实现了 brew() 和 addCondiments() 方法,定制饮品的冲泡和配料方式。
    • TeaMaker 覆盖了钩子方法,决定不添加配料。

优点

  • 代码复用:将通用代码放在父类,避免子类重复实现。
  • 算法统一控制:模板方法确保算法结构不变,子类只能修改特定步骤。
  • 扩展性:子类可以灵活扩展或修改算法的特定部分。

缺点

  • 子类数量可能过多:如果每个变体都需要一个子类,会导致类爆炸。
  • 维护成本:如果模板方法过于复杂,修改父类可能影响所有子类。

实际应用

  • JDK中的应用:java.util.Collections 中的 sort() 方法使用了模板方法模式,通过 Comparator 接口让用户自定义排序规则。
  • Servlet中的应用:HttpServlet 中的 doGet()、doPost() 方法就是模板方法的扩展点。
  • Spring框架:JdbcTemplate、HibernateTemplate 等模板类都使用了此模式。

注意事项

  • 模板方法应声明为 final:防止子类修改算法结构。
  • 合理使用钩子方法:钩子方法可以让子类控制算法的某些步骤,增加灵活性。

通过模板方法模式,可以在父类中定义通用的算法框架,让子类专注于实现差异化的部分,从而提高代码的复用性和可维护性。

除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/hou-duan/4416

相关文章

  • 6个高频设计模式深度解析(附完整案例与避坑指南)
  • Java设计模式:状态模式
  • Java设计模式:策略模式
  • JAVA设计模式-抽象工厂模式
  • JAVA设计模式-工厂方法模式
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: JAVA 模板方法模式 设计模式
最后更新:2025年11月20日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

秋天是倒放的春天,晚安是爱你的序篇。

那年今日(07月03日)

  • 2005年:西班牙正式通过同性婚姻相关法案
  • 1969年:英国滚石乐队的创始团员布莱恩·琼斯去世
  • 1876年:中国第一条铁路淞沪铁路正式通车运营
  • 1518年:中国明代医学家兼药物学家李时珍出生
  • 1062年:中国北宋官员包拯去世
  • 更多历史事件
最新 热点 随机
最新 热点 随机
Kratos+主题新功能预览及功能演示 SpringBoot DeferredLog 完整详解 LiteLLM 本地代理搭建 Claude-HUD 使用文档 Kratos+ —— Kratos 主题二次开发记录 译文:如何将单体应用拆解为微服务
AI时代,个人技术博客的出路在哪里?这个域名注册整整十年了,十年时间,真快啊WordPress实现用户评论等级排行榜插件WordPress网站换了个字体,差点儿把样式换崩了做了一个WordPress文章热力图插件千万级大表新增字段实战指南:告别锁表与业务中断
Auld Lang Syne 缓存架构实战指南:6大核心缓存技术深度解析与落地方案 阿里巴巴的26款超神Java开源项目 Claude Code全维度实战指南:从入门到精通,解锁AI编程新范式 岁末 海琴烟~~~
最近评论
李锋镝 发布于 4 天前(06月30日) 目前是每天一换,一个星期不重样 :41:
不凡 发布于 4 天前(06月29日) 主题配色挺好看。 :2:
李锋镝 发布于 5 天前(06月29日) 已经更新了~
懋和道人 发布于 5 天前(06月29日) 境外与附件不能访问,其他都是正常的,如果不正常可以通过更换ip访问。
李锋镝 发布于 5 天前(06月29日) 403呀道长
标签聚合
SQL 多线程 日常 IDEA 数据库 ElasticSearch Spring AI编程 JVM JAVA SpringBoot MCP 分布式 MySQL docker AI 架构 K8s Redis WordPress
友情链接
  • Blogs·CN
  • Honesty
  • Mr.Sun的博客
  • 临窗旋墨
  • 哥斯拉
  • 彬红茶日记
  • 志文工作室
  • 懋和道人
  • 拾趣博客导航
  • 搬砖日记
  • 旧时繁华
  • 林羽凡
  • 瓦匠个人小站
  • 皮皮社
  • 知向前端
  • 蜗牛工作室
  • 韩小韩博客
  • 风渡言

COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

域名年龄

Theme Kratos+ By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号