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

        在软件开发中,设计模式为我们提供了一套经过验证的解决方案,用于解决常见的设计问题。其中,模版方法模式(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,一经查实,立即删除!

相关文章

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

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

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

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

计算机网络-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 装包

美畅物联丨视频接入网关如何配置 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…

11.23[大数据]

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

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

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

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

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

MySQL-DDL之数据表操作

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

【开源安全保护】如何安装JumpServer堡垒机

【开源安全保护】如何安装JumpServer堡垒机 什么是堡垒机 大家好,我是星哥,今天我以前来认识堡垒机 堡垒机(Bastion Host),也称为跳板机(Jump Server),是指在计算机网络中&#x…

【经典论文阅读】DDPM(Diffusion)

DDPM(Diffusion) denoising diffusion probabilistic models 【生成模型】DDPM概率扩散模型(原理代码)-CSDN博客 【DDPM】一文看懂去噪扩散概率模型,公式讲解、代码实现与最全详解(一)-CSDN博客 【DDPM】…

重拾Java:穿越最具多功能性的编程语言之旅

你知道Java是世界上最广泛使用的编程语言之一吗?无论是用于Web应用、企业系统,还是Android开发,Java始终是各级开发者的可靠选择。 在完成SESI SENAI的系统开发技术培训后,我决定重新学习这门语言。现在,我将其与我正…

MySQL--用户权限

1.使用root用户登录MySQL客户端,创建一个名为userl的用户,初始密码为123456;创建一个名为user2的用户,无初始密码。然后,分别使用uesr1、user2登录MySQL 客户端。 创建两个用户 使用user1登录 使用user2登录 2.使用root用户登录&a…

LabVIEW断路器检测系统

随着电网技术的快速发展,对电力系统的可靠性和安全性要求不断提高,塑壳断路器作为关键的保护设备,其出厂前的检测非常重要。开发了一种基于LabVIEW软件平台开发的塑壳断路器智能脱扣器检测系统,该系统能够有效提高检测的自动化水平…

Python实现Excel中数据条显示

Python中要实现百分比数据条的显示,可以使用pandas库,pandas图表样式的设置与Excel中的条件格式设置比较类似,比如Excel里常用的数据条的用法,在pandas中使用代码进行高亮显示,用来突出重点数据,下面一起来…

使用Vue3+Echarts实现加载中国地图,点击省份地图下钻(完整教程)

一. 前言 在众多 ECharts 图表类型中,开发者始终绕不开的有各种各样的地图开发,关于地图开发,可能比其他图表相对繁琐一些,其实说简单也简单,说复杂也复杂,其中不乏有层级地图、3D 地图等,感觉…

【机器学习】——windows下安装anaconda并在vscode上进行配置

一、安装anaconda 1.进入清华的镜像网站,下载自己电脑对应的anaconda版本。网站:https://repo.anaconda.com/archive/ 这里我下载的版本是anaconda3-2024.10-1-Windows-x86-64 2.下载完毕后开始安装anaconda 3.配置anaconda环境变量 在设置中找到编…