设计模式学习(15) 23-13 模版方法模式

文章目录

  • 0.个人感悟
  • 1. 概念
  • 2. 适配场景
    • 2.1 适合的场景
    • 2.2 常见场景举例
  • 3. 实现方法
    • 3.1 实现思路
    • 3.2 UML类图
    • 3.3 代码示例
  • 4. 优缺点
    • 4.1 优点
    • 4.2 缺点
  • 5. 源码分析

0.个人感悟

  • 个人对这个模式印象很深,属于是工作中自己无意识地用到过,后面看书才发现原来已有前辈总结出这个模式,并且更加全面
  • 模版方法模式真的是很典型、很实用,建议大家可以在代码中尝试尝试
  • 模版方法整体是基于继承机制的代码复用,有利于感受抽象、封装、继承、多态的魅力
  • 模版方法模式很好地展现了开闭原则和实现开闭地一个方式: 将变化(具体实现)与不变的部分(算法骨架)分离

1. 概念

英文定义(《设计模式:可复用面向对象软件的基础》)

Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without chaging the algorithm’s structure.

中文翻译

定义一个操作中的算法骨架,将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些特定步骤。

理解

  • 模板方法模式是一种行为型设计模式
  • 父类(抽象类)定义了一个算法的固定框架和流程(模板方法)
  • 具体步骤的实现延迟到子类中完成
  • 子类可以重写某些特定步骤,但不能改变算法的整体结构
  • 通过钩子方法(Hook Method)提供额外的扩展点,允许子类对算法的某些部分进行可选的重写

2. 适配场景

2.1 适合的场景

  • 当多个类有相同的方法流程,但某些步骤的实现不同时,需要提取公共行为到父类,避免代码重复
  • 存在固定的算法骨架,但具体步骤需要灵活变化,需要控制子类的扩展方式,确保算法结构不被破坏

2.2 常见场景举例

  • 制作饮料:冲泡咖啡、茶的流程相似(烧水、冲泡、加调料),但具体步骤不同
  • 数据导入处理:读取数据、验证数据、处理数据、保存数据的流程固定,但不同数据源处理方式不同
  • Spring框架的JdbcTemplate:连接数据库、执行SQL、处理结果集、关闭连接的流程固定
  • 各种初始化流程:游戏初始化、应用启动、设备自检等有固定步骤但细节不同的场景

3. 实现方法

3.1 实现思路

  1. 创建抽象类:定义算法的骨架
  2. 定义模板方法:使用final修饰,防止子类改变算法结构
  3. 定义抽象方法:子类必须实现的具体步骤
  4. 定义具体方法:父类提供的默认实现,子类可选择是否重写
  5. 定义钩子方法:提供默认实现,子类可选择重写以影响算法流程
  6. 创建具体子类:实现抽象方法,可选重写钩子方法

3.2 UML类图

角色说明

  • AbstractClass(抽象类):定义模板方法和算法骨架
  • ConcreteClass(具体子类):实现抽象步骤,可选重写钩子方法

3.3 代码示例

制作饮料,冲泡咖啡、茶的流程相似(烧水、冲泡、加调料),但具体步骤不同
定义模版:

publicabstractclassBeverageTemplate{// 定义算法骨架 final防止子类篡改/** * @description 制作饮料 * @author bigHao * @date 2026/1/20 **/publicfinalvoidprepareBeverage(){boilWater();brew();pourInCup();if(customerWantsCondiments()){addCondiments();}hook();}// 通用流程/** * @description 烧水 * @author bigHao * @date 2026/1/20 **/privatevoidboilWater(){System.out.println("烧水");}// 通用流程/** * @description 倒饮料 * @author bigHao * @date 2026/1/20 **/privatevoidpourInCup(){System.out.println("将饮料倒入杯子");}// 特异流程,子类实现/** * @description 酿造 * @author bigHao * @date 2026/1/20 **/protectedabstractvoidbrew();// 特异流程,子类实现/** * @description 添加作料 * @author bigHao * @date 2026/1/20 **/protectedabstractvoidaddCondiments();// 钩子方法-子类可以重写,用于流程控制/** * @description 钩子方法 * @author bigHao * @date 2026/1/20 **/protectedvoidhook(){// 默认空实现}// 钩子方法,用于流程控制,子类可以重写/** * @return boolean 是否需要 * @description 客户需要作料 * @author bigHao * @date 2026/1/20 **/protectedbooleancustomerWantsCondiments(){returntrue;}}

具体实现:

publicclassCoffeeextendsBeverageTemplate{@Overrideprotectedvoidbrew(){System.out.println("沸水冲泡咖啡");}@OverrideprotectedvoidaddCondiments(){System.out.println("加入糖和牛奶");}@Overrideprotectedvoidhook(){super.hook();System.out.println("hook");}}publicclassTeaextendsBeverageTemplate{@Overrideprotectedvoidbrew(){System.out.println("沸水煮茶叶");}@OverrideprotectedvoidaddCondiments(){System.out.println("加入柠檬");}}

测试:

publicclassClient{staticvoidmain(){System.out.println("=== 制作coffee ===");BeverageTemplatecoffee=newCoffee();coffee.prepareBeverage();System.out.println("=== 制作tea ===");BeverageTemplatetea=newTea();tea.prepareBeverage();}}

输出:

=== 制作coffee === 烧水 用非税冲泡咖啡 将饮料倒入杯子 加入糖和牛奶 hook === 制作tea === 烧水 沸水煮茶叶 将饮料倒入杯子 加入柠檬

4. 优缺点

4.1 优点

  • 提高代码复用性:将公共行为提取到父类,避免代码重复
  • 良好的扩展性:通过增加新的子类可以轻松扩展算法
  • 符合开闭原则:对扩展开放(新增子类),对修改关闭(不修改模板方法)
  • 提高可维护性:算法结构清晰,便于理解和维护
  • 封装不变部分:将不变的行为封装在父类,可变行为由子类实现

4.2 缺点

  • 可能导致类数量增加:每个不同的实现都需要一个子类
  • 父类与子类耦合:子类必须实现父类的抽象方法
  • 限制了子类的灵活性:子类不能改变算法的整体结构
  • 继承的固有缺点:Java单继承限制,子类无法继承其他类
  • 调试困难:模板方法中的流程控制可能使调试变得复杂

5. 源码分析

Spring中的HttpServlet类service()方法分析

// javax.servlet.http.HttpServlet 中的模板方法模式应用publicabstractclassHttpServletextendsGenericServlet{// 模板方法protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{Stringmethod=req.getMethod();if(method.equals("GET")){// 调用具体方法doGet(req,resp);}elseif(method.equals("POST")){doPost(req,resp);}elseif(method.equals("PUT")){doPut(req,resp);}// ... 其他HTTP方法}// 钩子方法 - 子类需要实现具体处理逻辑protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{// 默认实现:返回405错误(方法不允许)resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);}protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);}// ... 其他HTTP方法对应的钩子方法}

分析

  1. 模板方法service()方法定义了HTTP请求处理的整体流程
  2. 具体步骤:根据HTTP方法类型(GET、POST等)分发到不同的处理方法
  3. 钩子方法doGet()doPost()等由子类实现具体的业务逻辑
  4. 默认实现:父类提供错误响应的默认实现
  5. 扩展方式:开发者继承HttpServlet,只需重写需要处理的HTTP方法

使用示例

@WebServlet("/user")publicclassUserServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{// 处理GET请求:查询用户信息// ...}@OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{// 处理POST请求:创建用户// ...}}

参考:

  • 韩顺平 Java设计模式
  • 张维鹏 Java设计模式之行为型:模板方法模式
  • java_my_life 《JAVA与模式》之模板方法模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1189380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026 升降炉生产厂家权威推荐,聚焦控温精度与节能性能的品质品牌全解析 - 品牌推荐大师1

升降炉作为高温热处理领域的核心设备,广泛应用于材料科学、冶金陶瓷、半导体加工、新能源研发等关键行业,其温控精度、稳定性、节能性及安全性直接决定生产与实验效果。随着制造业向高端化、智能化转型,市场对高性能…

海外代理ip哪个好用 - 高级品牌推荐官

2026年海外代理IP哪个好用?精选高权值住宅ISP代理实测排行榜行业背景:2026年AI风控时代下的“身份信用”博弈步入2026年,全球互联网生态的防御机制已全面进入“全路径AI审计”时代。对于从事跨境电商矩阵管理、海外…

详细介绍:Linux内核(升级、编译)

详细介绍:Linux内核(升级、编译)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

指纹浏览器哪个好用 - 高级品牌推荐官

2026年指纹浏览器哪个好用?深度评测:高安全性防关联工具排行榜行业背景:2026年全球互联网风控的“全息审计”时代步入2026年,全球主流互联网巨头(如Amazon、TikTok、Meta、Google等)的账号安全审计与反欺诈系统已…

2026年国内质量好的保温装饰一体板制造厂家有哪些,岩棉保温装饰一体板/一体板,保温装饰一体板加工厂电话 - 品牌推荐师

行业现状与保温装饰一体板的核心价值 近年来,随着“双碳”目标推进及建筑节能标准升级,外墙保温装饰一体板凭借“保温+装饰+防火”一体化功能,成为建筑外立面升级的主流选择。相较于传统薄抹灰系统,一体板通过工厂…

长沙研究生留学机构最新口碑排名揭晓,申请成功率高成核心指标 - 留学机构评审官

长沙研究生留学机构最新口碑排名揭晓,申请成功率高成核心指标一、 长沙研究生留学机构如何选择?高成功率成为关键考量2026年1月9日。近年来,随着留学需求日益精细化与理性化,长沙地区的研究生申请者们面临着一个普…

指纹浏览器排行榜 - 高级品牌推荐官

行业背景:2026年全球互联网风控的“硬件溯源”时代跨入2026年,全球主流互联网巨头(如Amazon、TikTok、Meta、Google等)的账号安全审计与反欺诈系统已全面迈入“AI全息识别”阶段。现在的风控逻辑已不再满足于基础的…

设计模式学习(16) 23-14 命令模式

文章目录0. 个人感悟1. 概念2. 适配场景2.1 适合的场景2.2 常见场景举例3. 实现方法3.1 实现思路3.2 UML类图3.3 代码示例4. 优缺点4.1 优点4.2 缺点5. 源码分析0. 个人感悟 命令模式核心是将请求或者操作封装成对象。那么就可以基于这些对象进行额外操作,比如队列…

P4411 [BJWC2010] 取数游戏 题解

题意简析 给定序列 \(a\),求出选择的使得相邻的两数 \(\gcd \ge L\) 的最长的子序列的长度。 思路解析 一拿到题目,我们就看见有求最长的子序列,我们想到了 LIS,可惜这里有条件才能转移。 令 \(dp_i\) 为 LIS 长度…

2026年市场口碑好的保温装饰一体化板制造厂家电话,一体板/保温装饰一体化板,保温装饰一体化板直销厂家联系电话 - 品牌推荐师

评测背景:行业需求升级倒逼产品与服务双迭代 随着建筑节能政策持续深化与绿色建筑标准提升,保温装饰一体化板作为集保温、装饰、防火功能于一体的新型建材,市场需求呈现爆发式增长。然而,行业快速扩张背后,产品空…

数据泄露:网络安全领域的新热点

数据泄露:网络安全领域的新热点 近年来,随着数字经济的快速发展,数据成为企业与个人的核心资产,但数据泄露事件也呈 “爆发式增长”—— 从大型企业(如 Facebook、万豪酒店)的亿级用户数据泄露,…

2026年市场可靠的一体板制造厂家哪家强,聚氨酯保温装饰一体板/仿石漆保温装饰一体板,一体板直销厂家有哪些 - 品牌推荐师

在建筑节能与绿色建材领域,外墙装饰一体板作为兼具保温、装饰、防火功能的核心产品,其品质直接影响建筑能耗、施工效率及长期维护成本。据行业权威机构统计,2025年国内一体板市场规模突破300亿元,但产品同质化、服…

Agentic RAG核心解析(必收藏):从原理到架构,搞定复杂场景检索

Agentic RAG(智能体增强检索增强生成)是将Agent自主规划与决策能力融入传统RAG的进阶技术,核心目标是突破传统RAG的局限,高效应对企业级复杂查询场景。相较于传统RAG的固定流程,它能自主选择检索引擎、规划检索步骤、评…

迷宫游戏的设计与实现

运行效果:https://lunwen.yeel.cn/view.php?id=5811 迷宫游戏的设计与实现摘要:本文针对迷宫游戏这一娱乐形式,探讨了其设计理念、游戏规则、关卡设置以及用户交互等方面。通过对国内外迷宫游戏的研究,分析了现有…

血液离心机怎么选?7大头部品牌全解析与采购避坑指南 - 品牌推荐大师1

当清晨的第一缕阳光照进医院检验科,血液离心机已开始嗡嗡运转——作为现代医疗诊断的“隐形守护者”,这些设备正决定着成千上万份检验报告的准确性与及时性。根据国家卫健委最新统计数据,我国每年临床血液检测量已超…

印刷糊箱联动线选购指南:2026年哪些厂商值得信赖?行业内印刷糊箱联动线厂家赋能企业生产效率提升与成本优化 - 品牌推荐师

在包装行业智能化升级的浪潮中,印刷糊箱联动线作为纸箱生产的核心设备,直接影响着包装企业的生产效率、成本控制与产品质量。据中国包装联合会统计,2025年国内纸箱包装市场规模突破1.2万亿元,企业对高精度、高稳定…

《P2520 [HAOI2011] 向量》

题目描述给你一对数 (a,b),你可以任意使用 (a,b),(a,−b),(−a,b),(−a,−b),(b,a),(b,−a),(−b,a),(−b,−a) 这些向量,问你能不能拼出另一个向量 (x,y)。说明:这里的拼就是使得你选出的向量之和为 (x,y)。输入格式第一行数组组数 t(t≤500…

Node.js 用hashring轻松做负载均衡

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Node.js负载均衡新范式:用hashring实现高效、稳定的分布式服务目录Node.js负载均衡新范式:用hashring实现…

博四预答辩结束

博四预答辩结束经过两三个月对毕业论文的打磨以及准备,比较完美的完成了预答辩,想起这一路在本课题的研究,也是非常不容易,如果继续有公司的支持,我相信,我会在这条路上走得更远,我已经经历了,希望这条路越来越…

【Python视觉】文字怎么“贴”在瓶子上?揭秘 AI 如何利用“网格变形”实现曲面包装的完美汉化

Python 计算机视觉 TPS变换 曲面映射 图像处理 跨境电商摘要在跨境电商中,瓶装产品(化妆品、补剂、饮料) 的图片本地化一直是技术难点。因为文字不是印在平面上,而是附着在圆柱体或不规则曲面上。普通的 AI 翻译工具只能进行平面的…