设计模式-模板方法实现

ops/2025/1/22 21:11:19/

文章目录

    • 模式结构
    • 模式特点
    • 示例代码
    • 输出结果
    • 关键点解析
    • 模式的优缺点
    • 使用场景
    • 总结

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

模式结构

模板方法模式的结构包括以下几个关键部分:

  1. 抽象类(Abstract Class):定义算法的骨架,并包含一个或多个抽象方法,留给子类实现
  2. 具体子类(Concrete Class):实现抽象类中的抽象方法,完成具体的算法步骤
  3. 模板方法(Template Method):在抽象类中定义的具体方法,按照一定的步骤调用抽象方法,确保算法的整体结构

模式特点

  • 封装不变部分,扩展可变部分:算法的骨架固定在抽象类中,具体实现细节由子类完成
  • 遵循开闭原则:新增功能时,只需扩展子类,而不需要修改抽象类
  • 减少代码重复:公共逻辑封装在抽象类中,避免子类重复实现

示例代码

以下是一个使用模板方法模式的示例:制作饮品的过程

java">// 抽象类:饮品制作流程
abstract class Beverage {// 模板方法:定义饮品制作的算法骨架public final void prepareRecipe() {boilWater();brew();pourInCup();if (customerWantsCondiments()) {addCondiments();}}// 公共步骤,所有饮品都需要private void boilWater() {System.out.println("Boiling water.");}private void pourInCup() {System.out.println("Pouring into cup.");}// 抽象步骤,由子类实现protected abstract void brew();protected abstract void addCondiments();// 钩子方法:提供默认实现,子类可选择覆盖protected boolean customerWantsCondiments() {return true;}
}// 具体类:制作茶
class Tea extends Beverage {@Overrideprotected void brew() {System.out.println("Steeping the tea.");}@Overrideprotected void addCondiments() {System.out.println("Adding lemon.");}
}// 具体类:制作咖啡
class Coffee extends Beverage {@Overrideprotected void brew() {System.out.println("Dripping coffee through filter.");}@Overrideprotected void addCondiments() {System.out.println("Adding sugar and milk.");}
}// 测试代码
public class TemplateMethodExample {public static void main(String[] args) {System.out.println("Making tea:");Beverage tea = new Tea();tea.prepareRecipe();System.out.println("\nMaking coffee:");Beverage coffee = new Coffee();coffee.prepareRecipe();}
}

输出结果

java">Making tea:
Boiling water.
Steeping the tea.
Pouring into cup.
Adding lemon.Making coffee:
Boiling water.
Dripping coffee through filter.
Pouring into cup.
Adding sugar and milk.

关键点解析

  1. 模板方法的作用
    • prepareRecipe() 是模板方法,定义了制作饮品的固定流程。
    • 子类通过实现 brew()addCondiments() 方法,提供具体的制作细节。
  2. 钩子方法的灵活性
    • 钩子方法 customerWantsCondiments() 提供了默认实现,子类可以选择性地覆盖它来改变行为。
  3. 防止子类修改流程
    • 模板方法通常使用 final 修饰,防止子类改变算法骨架。

模式的优缺点

优点:

  1. 代码复用:将通用代码封装在抽象类中,减少重复代码。
  2. 灵活扩展:子类可以通过实现或重写方法定制具体行为。
  3. 清晰的流程控制:模板方法明确了算法的步骤和执行顺序。

缺点:

  1. 类的数量增加:每个具体实现都需要定义一个子类,可能导致类的数量增多。
  2. 继承的限制:模板方法模式依赖继承,可能降低灵活性,子类之间存在强耦合。

使用场景

模板方法模式适用于以下场景:

  1. 具有固定流程的操作:算法的步骤固定,但某些步骤的实现可能变化。
  2. 复用公共逻辑:多个子类有相同的操作步骤,可以抽取到抽象类中。
  3. 需要灵活扩展的流程:通过钩子方法和抽象方法,子类可以灵活定制行为。

总结

模板方法模式通过将算法的骨架固定在抽象类中,确保了流程的稳定性,同时允许子类定制具体实现,达到了复用与扩展的平衡。它是一种经典的设计模式,广泛应用于框架设计、业务流程管理等场景中。


http://www.ppmy.cn/ops/152280.html

相关文章

一文大白话讲清楚webpack基本使用——6——热更新及其原理

文章目录 一文大白话讲清楚webpack基本使用——6——热更新及其原理1. 建议按文章顺序从头看,一看到底,豁然开朗2. 啥是热更新HMR3. 热更新怎么用4.热更新的原理 一文大白话讲清楚webpack基本使用——6——热更新及其原理 1. 建议按文章顺序从头看&…

为什么数据库不应该使用外键

一、引言 当我们需要持久化地存储数据时,关系型数据库通常是首选。它不仅种类丰富、稳定,而且得到了广泛社区的支持。本文将探讨关系型数据库中的一个重要概念——外键(Foreign Key)。 二、外键的作用 在关系型数据库中&#xf…

Models如何使用Gorm与数据库进行交互?

Gorm是Models与MySQL数据库连接的中间体(Models是通过Gorm与数据库连接起来的) Golang的代码解析成SQL语句,把查到的数据解析成GOlang的数据结构 GORM 是什么? GORM 是一个 Go 语言的 ORM(对象关系映射)库…

一文速通stack和queue的理解与使用

CSTL之stack和queue 1.stack1.1.stack的基本概念1.2.stack的接口 2.queue2.1.queue的基本概念2.2.queue的接口 3.priority_queue3.1.priority_queue的基本概念3.2.priority_queue的接口3.3.仿函数 4.容器适配器5.deque5.1.deque的简单了解5.2.deque的优缺点 🌟&…

Pytest+Allure+Excel接口自动化测试框架实战

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允许…

图数据库 | 19、高可用分布式设计(下)

相信大家对分布式系统设计与实现的复杂性已经有了一定的了解,本篇文章对分布式图数据库系统中最复杂的一类系统架构设计进行探索,即水平分布式图数据库系统(这个挑战也可以泛化为水平分布式图数据仓库、图湖泊、图中台或任何其他依赖图存储、…

Python新春烟花

目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…

2025年前端面试题汇总

JavaScript核心 异步编程 Promise、async/await 的工作原理及应用场景。如何处理并发请求,使用Promise.all()或Promise.race()等方法。解释事件循环机制,理解微任务(microtask)与宏任务(macrotask)的区别。…