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

23种设计模式——模板方法模式(Template Method Pattern)详解

 ✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏: 设计模式
✨特色专栏: 知识分享
🥭本文内容: 23种设计模式——模板方法模式(Template Method Pattern)详解
📚 ** ps **  : 阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。


目录

一、背景

二、介绍

三、核心概念

四、使用场景

五、Java代码示例

六、优点

七、注意事项


一、背景

模板方法模式在项目java项目中偶尔会有使用,特别是在封装基类并且基类的某个方法执行顺序(比如生命周期)很重要的时候。比如android的基类activity代码。


二、介绍

模板方法模式是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。这种模式使得子类可以不改变算法结构的情况下重新定义算法的某些特定步骤。


三、核心概念

  1. ​抽象类(Abstract Class)​​:定义算法骨架和抽象方法

  2. ​具体类(Concrete Class)​​:实现抽象类中的抽象方法


四、使用场景

  • 当多个类有相同的方法,但实现方式不同时

  • 需要控制子类扩展时(通过钩子方法)

  • 重构时发现多个类有相似的算法结构时


五、Java代码示例

// 抽象类定义模板方法
abstract class AbstractClass {// 模板方法,定义算法骨架public final void templateMethod() {step1();step2();step3();if (hookMethod()) {step4();}}// 具体步骤private void step1() {System.out.println("执行步骤1");}// 抽象方法,由子类实现protected abstract void step2();// 默认实现,子类可选择覆盖protected void step3() {System.out.println("执行默认步骤3");}protected void step4() {System.out.println("执行可选步骤4");}// 钩子方法,子类可覆盖以改变算法流程protected boolean hookMethod() {return true;}
}// 具体实现类A
class ConcreteClassA extends AbstractClass {@Overrideprotected void step2() {System.out.println("ConcreteClassA 实现步骤2");}@Overrideprotected boolean hookMethod() {return false; // 不执行步骤4}
}// 具体实现类B
class ConcreteClassB extends AbstractClass {@Overrideprotected void step2() {System.out.println("ConcreteClassB 实现步骤2");}@Overrideprotected void step3() {System.out.println("ConcreteClassB 覆盖步骤3");}
}// 使用示例
public class TemplateMethodDemo {public static void main(String[] args) {AbstractClass classA = new ConcreteClassA();classA.templateMethod();System.out.println("----------------");AbstractClass classB = new ConcreteClassB();classB.templateMethod();}
}

六、优点

  1. 提高代码复用性,将公共代码放在抽象类中

  2. 便于扩展,子类只需实现自己的特定步骤

  3. 符合开闭原则,增加新子类无需修改现有代码


七、注意事项

  1. 模板方法应声明为final,防止子类覆盖算法结构

  2. 抽象方法数量不宜过多,否则会增加子类实现难度

  3. 合理使用钩子方法,增加灵活性

模板方法模式在Java中广泛应用,例如:

  • Java IO中的InputStream/OutputStream

  • Servlet中的HttpServlet

  • Spring框架中的JdbcTemplate等


最后,

        其它设计模式会陆续更新,希望文章对你有所帮助!

http://www.lryc.cn/news/626580.html

相关文章:

  • 在一台没联网的机器上,用ollama加载qwen3,14b
  • 遥感机器学习入门实战教程|Sklearn 案例④ :多分类器对比(SVM / RF / kNN / Logistic...)
  • 使用 GraalVM Native Image 将 Spring Boot 应用编译为跨平台原生镜像:完整指南
  • Spring Boot 配置
  • nvidia最新论文:小型语言模型是代理人工智能的未来
  • (5)软件包管理器 yum | Vim 编辑器 | Vim 文本批量化操作 | 配置 Vim
  • 5G-A赋能AR眼镜:毫米级虚实融合的未来已来
  • 开源 AR 眼镜怎么选?OpenGlass ,OSSG,cheApR 分析推荐
  • 给你的Unity编辑器添加实现类似 Odin 的 条件显示字段 (ShowIf/HideIf) 功能
  • 用好 Elasticsearch Ruby 传输层elastic-transport
  • 二维码跳转支付宝、微信小程序二码合一(直接关联、中间页识别跳转)方案
  • python-使用鼠标对图片进行涂抹自定义绘图
  • 自己微调的大模型如何用ollama运行
  • Android 开发问题:android:marginTop=“20px“ 属性不生效
  • 数字化图书管理系统设计实践(java)
  • Redis 复制功能是如何工作的
  • Linux I/O 多路复用实战:Select/Poll 编程指南
  • iOS 应用上架常见问题与解决方案,多工具组合的实战经验
  • Redis--day9--黑马点评--分布式锁(二)
  • C++ 数据结构 和 STL
  • 大数据毕业设计选题推荐-基于大数据的1688商品类目关系分析与可视化系统-Hadoop-Spark-数据可视化-BigData
  • wpf之ComboBox
  • 软件测试面试题真题分享
  • 数据挖掘笔记:点到线段的距离计算
  • 百度Q2财报:总营收327亿 AI新业务收入首次超100亿
  • PDF如何在Adobe Acrobat 中用OCR光学识别文档并保存可编辑文档
  • 【鸿蒙心迹】7×24小时极限求生:当Origin_null遇上鸿蒙,我如何用100杯咖啡换一条跨域活路?
  • 环境搭建:centos7+docker+Oracle
  • 【Day 30】Linux-SQL语句
  • 【爬虫实战-IP代理的重要性二】 以Selenium为例