模版方法模式的理解和实践

        在软件开发中,设计模式为我们提供了一套经过验证的解决方案,用于解决常见的设计问题。其中,模版方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的框架,并允许子类在不改变算法结构的情况下重定义算法的某些特定步骤。本文将详细探讨模版方法模式的理解和实践,并通过Java语言编写示例代码来展示其应用。

 

一、模版方法模式的理解

        模版方法模式的核心思想是将算法的框架定义在父类中,而将一些具体步骤的实现延迟到子类中。通过这种方式,可以在不改变算法整体结构的前提下,让子类能够灵活地定制算法的具体行为。

        模版方法模式通常包含以下几个角色:

  1. 抽象类(Abstract Class):定义了一个或多个抽象方法(具体操作),以及一个或多个具体方法(步骤)和一个模版方法(算法框架)。
  2. 具体子类(Concrete Class):实现抽象类中的抽象方法,从而定制算法的具体行为。

        模版方法模式的主要优点包括:

  • 代码复用:通过定义算法的框架,可以复用父类中的代码。
  • 扩展性:子类可以通过实现不同的抽象方法来定制算法的具体行为,从而方便地扩展系统。
  • 灵活性:可以在不改变算法结构的情况下,通过子类来改变算法的具体实现。

二、模版方法模式的实践

        下面我们通过一个简单的例子来展示模版方法模式的应用。假设我们要实现一个咖啡冲泡过程,其中包含了研磨咖啡豆、冲泡咖啡和倒咖啡等步骤。不同的咖啡(如浓缩咖啡和拿铁咖啡)在冲泡过程中可能有不同的具体实现,但整体流程是相似的。

1. 定义抽象类

        首先,我们定义一个抽象类Coffee,它包含了冲泡咖啡的算法框架(模版方法)和一些具体步骤(研磨咖啡豆、冲泡咖啡和倒咖啡)。其中,brewpourInCup方法是具体的步骤,而grindBeansaddMilk方法是抽象的,需要在子类中实现。

// 抽象类 Coffee
abstract class Coffee {// 模版方法:定义冲泡咖啡的算法框架final void prepareRecipe() {boilWater();grindBeans();  // 抽象方法,在子类中实现brewCoffeeGrinds();pourInCup();if (wantsMilk()) {addMilk();  // 抽象方法,在子类中实现}}// 具体方法:烧开水void boilWater() {System.out.println("Boiling water");}// 具体方法:研磨咖啡豆(抽象方法在子类中实现)abstract void grindBeans();// 具体方法:冲泡咖啡粉void brewCoffeeGrinds() {System.out.println("Dripping coffee through filter");}// 具体方法:将咖啡倒入杯子void pourInCup() {System.out.println("Pouring coffee into cup");}// 钩子方法:是否需要加牛奶(默认不加)boolean wantsMilk() {return false;}// 抽象方法:加牛奶(在子类中实现)abstract void addMilk();
}


2. 定义具体子类

        接下来,我们定义两个具体子类EspressoLatte,它们分别实现了grindBeansaddMilk方法,从而定制了冲泡浓缩咖啡和拿铁咖啡的具体行为。

// 具体子类 Espresso
class Espresso extends Coffee {@Overridevoid grindBeans() {System.out.println("Grinding espresso beans");}@Overridevoid addMilk() {// 浓缩咖啡不加牛奶System.out.println("No milk for espresso");}// 重写钩子方法,返回 false 表示不需要加牛奶@Overrideboolean wantsMilk() {return false;}
}// 具体子类 Latte
class Latte extends Coffee {@Overridevoid grindBeans() {System.out.println("Grinding dark roast beans");}@Overridevoid addMilk() {System.out.println("Adding steamed milk");}// 重写钩子方法,返回 true 表示需要加牛奶@Overrideboolean wantsMilk() {return true;}
}


3. 使用模版方法模式

        最后,我们编写一个客户端代码来演示如何使用模版方法模式来冲泡咖啡。

public class CoffeeTemplateDemo {public static void main(String[] args) {Coffee espresso = new Espresso();System.out.println("Making an espresso:");espresso.prepareRecipe();System.out.println("\nMaking a latte:");Coffee latte = new Latte();latte.prepareRecipe();}
}


        运行上述代码,输出结果如下:

Making an espresso:
Boiling water
Grinding espresso beans
Dripping coffee through filter
Pouring coffee into cup
No milk for espressoMaking a latte:
Boiling water
Grinding dark roast beans
Dripping coffee through filter
Pouring coffee into cup
Adding steamed milk


        通过上述示例,我们可以看到,模版方法模式允许我们在不改变冲泡咖啡整体流程的情况下,通过子类来定制不同的冲泡细节。这使得代码更加灵活和可扩展。

总结

        模版方法模式是一种强大的设计模式,它通过将算法的框架定义在父类中,而将一些具体步骤的实现延迟到子类中,从而实现了代码的复用和扩展。在实际开发中,模版方法模式可以应用于各种需要定义算法框架并允许子类定制具体行为的场景。

        通过本文的讲解和示例代码,相信读者已经对模版方法模式有了更深入的理解和实践经验。希望读者能够在未来的开发中灵活运用这一设计模式,提升代码的质量和可维护性。

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

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

相关文章

洛谷【排序】算法的题单 - 笔记

2024-12-09 - 第 37 篇 洛谷【排序】题单 - 笔记 作者(Author): 郑龙浩 / 仟濹(CSND账号名) 洛谷【排序】题单合集 一、排序算法都有… 1. 简单排序算法 这些算法通常是基础的排序方法,容易理解和实现,但效率较低,适用于数据量较小的情况…

MySQL--》如何在SQL中巧妙运用函数与约束,优化数据处理与验证?

目录 函数使用 字符串函数 数值函数 日期函数 流程函数 约束 函数使用 函数是指一段可以直接被另一段程序调用的程序或代码,在mysql当中有许多常见的内置函数,接下来开始对这些内置函数及其作用进行简单的讲解和使用: 字符串函数 my…

归有光,情感与真实的独行者

归有光,字熙甫,号震川,生于明孝宗弘治十年(公元1507年),卒于明穆宗隆庆五年(公元1571年),享年64岁。他是中国明代著名的散文家、文学家和史学家,其散文风格清…

Python + OpenCV 系列:图像阈值处理

文章目录 引言 1. 阈值处理的基本概念2. OpenCV 中的阈值处理3. 常见的阈值类型3.1 二值化阈值3.2 反向二值化阈值3.3 截断阈值3.4 平滑阈值 4. 自适应阈值5. Otsu’s 阈值法6. 阈值处理的应用场景7. 总结 引言 图像阈值处理是计算机视觉和图像处理中一种非常基础而重要的技术…

计算机网络-Wireshark探索ARP

使用工具 Wiresharkarp: To inspect and clear the cache used by the ARP protocol on your computer.curl(MacOS)ifconfig(MacOS or Linux): to inspect the state of your computer’s network interface.route/netstat: To inspect the routes used by your computer.Brows…

Vue3小兔鲜电商项目

创建项目 npm install 装包

【NLP 12、深度学习15条调参经验】

反正是绚烂,反正是到来 反正是背负慢慢凋残的孤独 耀眼的孤独,义无反顾的孤独 —— 24.12.9 深度学习15条调参经验 1.调参 调参是锦上添花的事,而底线取决于模型的选择和数据的清洗 2.关于model ① 尽量不要自己手写模型,找一…

美畅物联丨视频接入网关如何配置 HTTPS 证书

在安防领域,视频接入网关(Video Access Gateway,VAG)是视频监控系统的重要组成部分,其职责是把视频数据从前端设备传输至后端服务器。配置HTTPS证书后,可对视频流进行加密传输,避免数据在网络传…

fastcam编程套料软件

Fastcam是一款功能强大的专业软件,以下是对它的具体介绍: 基本信息 • Fastcam自1982年推出首个交互式CNC编程和套料系统后,一直不断更新发展. • 它是为数控火焰、等离子、激光和水射流切割机等数控切割机开发的编程套料软件. 主要功能模…

【大语言模型】LangChain ModelsIO与Models I/O Promopts详解

【大语言模型】LangChain ModelsIO与Prompts详解 一、LangChain ModelsIO1、简介2、Models I/O 的应用场景3、Models I/O 主要模块3.1、Prompts3.2、Modelsa、MESSAGES 类型 3.3、Output Parsers 二、LangChain ModelsIO Prompts1、简介2、Prompts 的优点3、实战示例3.1、Promp…

MicroBlaze软核开发(三):DDR + FLASH

实现功能:使用 MicroBlaze软核,配置 DDR、Flash 接口,并将程序烧写固化到Flash,每次启动 FPGA 时自动运行 Flash 中的程序 。 Vivado版本:2018.3 FPGA:Xilinx Artix-7 系 目录 引言 Vivado部分&#xff1…

Springboot(五十三)SpringBoot3整合redisson

前边我们有记录Springboot2/3整合redis的方式。是基于Springboot默认集成的Lettuce客户端实现的。 今天我们在项目中集成的redission是在Lettuce之上构建的redis客户端。 Redisson:一个在Jedis和Lettuce之上构建的Redis客户端。提供了一系列分布式Java对象和服务,比如:分布式…

渗透测试基础

渗透测试基础是指对计算机系统、网络或应用程序进行模拟攻击,以发现其安全漏洞和潜在威胁的一种安全评估技术。通过模拟真实的攻击场景,渗透测试帮助组织了解其系统的安全弱点、验证防护措施的有效性,并提供改进建议。 渗透测试的核心概念 1…

ejb组件(rmi) webservice平台(xml)

springboot bean 在 Spring Boot 中,Bean 是 Spring 框架的核心概念之一,表示由 Spring 容器管理的对象。通过 Bean 或其他注解(如 Component、Service、Repository 等)来定义和管理这些对象。以下是关于 Spring Boot 中 Bean 的…

11.23[大数据]

PRO1:LSTM模型预测输出都是同一个值? 画出来的图像就是一条横线 这个搜了搜,原因可能有很多,但感觉最主要的原因极可能是激活函数选择不当,以及层的搭建不合适 原模型是 REF https://zhuanlan.zhihu.com/p/654325094 https:/…

基于SpringBoot+Vue的新闻管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网技术的飞速发展,信息传播速度不断加快,新闻媒体行业面临着巨大的机遇与挑战。传统的新闻媒体正在逐渐向数字化转型,而新闻管理系统作为数字化新闻媒体的核心组成部分,其…

VCP-CLIP A visual context prompting modelfor zero-shot anomaly segmentation

GitHub - xiaozhen228/VCP-CLIP: (ECCV 2024) VCP-CLIP: A visual context prompting model for zero-shot anomaly segmentation 需要构建正样本,异常样本,以及对应的Mask

el-menu修改el-menu-item的高度后,里面的文字和图标高度没跟着变

解决方法 设置line-height的值和height一样。 <style lang"scss" scoped> .el-menu-item {height: 40px;line-height: 40px; } </style>

【C语言】完成程序设计填空

文章目录 1、请阅读下面的程序,在空白处填写正确的代码,要求各在一行从头开始输出m和n的值。2、求100~599之间的所有水仙花数,即各位数字的立方和恰好等于该数本身的数。3、以下程序的功能是:将值为三位正整数的变量x中的数值按照个位、十位、百位的顺序 拆分并输出。请填空…

MySQL-DDL之数据表操作

文章目录 一. 表的创建1. 表的创建2. 栗子 二. 查看表1. 查看数据库中的所有表2. 查看表结构 三. 删除表1. 删除表 四. 修改表结构1. 添加字段2. 修改字段3. 删除字段4. 修改表名 数据定义语言&#xff1a;简称DDL(Data Definition Language) 一. 表的创建 1. 表的创建 格式&…