Java中的模版方法设计模式详解

news/2024/5/15 11:28:45

Java中的模版方法设计模式详解

在Java编程中,设计模式是一种解决常见问题的最佳实践。其中,模版方法设计模式是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。这样可以使子类在不改变算法结构的情况下,重新定义算法中的某些特定步骤。

下面,我们将通过一个简单的例子来详细解释模版方法设计模式的概念和用法。

一、模版方法设计模式概述

模版方法设计模式包含两个部分:抽象类和具体子类。抽象类中定义了一个或多个抽象方法和一个模版方法。模版方法是一个具体的方法,它调用了抽象类中的抽象方法。子类继承抽象类并实现抽象方法,但不需要改变模版方法的结构。

二、代码示例

假设我们要设计一个泡茶的流程,不同的茶有不同的泡茶方式,但基本的泡茶步骤是相似的。我们可以使用模版方法设计模式来实现这个需求。

首先,我们定义一个抽象类Tea,它包含了泡茶的模版方法prepareTea和一些抽象方法,如boilWaterpourWaterIntoCupaddTeabag等。

// 抽象类 Tea
public abstract class Tea {// 模版方法,定义了泡茶的基本流程public final void prepareTea() {boilWater(); // 烧开水pourWaterIntoCup(); // 倒水入杯addTeabag(); // 加茶包steep(); // 浸泡removeTeabag(); // 取出茶包pourIntoCup(); // 倒茶入杯addCondiments(); // 添加调料}// 抽象方法,由子类实现具体的步骤protected abstract void boilWater();protected abstract void pourWaterIntoCup();protected abstract void addTeabag();protected abstract void steep();protected abstract void removeTeabag();protected abstract void pourIntoCup();protected abstract void addCondiments();
}

然后,我们创建具体的子类GreenTeaBlackTea,它们继承自Tea抽象类,并实现其中的抽象方法。

// 绿茶类,继承自 Tea 抽象类
public class GreenTea extends Tea {@Overrideprotected void boilWater() {System.out.println("Boiling water for green tea.");}@Overrideprotected void pourWaterIntoCup() {System.out.println("Pouring water into cup for green tea.");}// ... 实现其他抽象方法 ...@Overrideprotected void addCondiments() {System.out.println("No condiments for green tea.");}
}// 红茶类,同样继承自 Tea 抽象类
public class BlackTea extends Tea {@Overrideprotected void boilWater() {System.out.println("Boiling water for black tea.");}@Overrideprotected void pourWaterIntoCup() {System.out.println("Pouring water into cup for black tea.");}// ... 实现其他抽象方法 ...@Overrideprotected void addCondiments() {System.out.println("Adding sugar and milk for black tea.");}
}

最后,在客户端代码中,我们可以创建GreenTeaBlackTea的实例,并调用它们的prepareTea方法,来执行各自的泡茶流程。

public class Main {public static void main(String[] args) {Tea greenTea = new GreenTea();greenTea.prepareTea(); // 执行绿茶的泡茶流程Tea blackTea = new BlackTea();blackTea.prepareTea(); // 执行红茶的泡茶流程}
}

三、总结

模版方法设计模式通过定义算法骨架,使得子类可以在不改变算法结构的情况下,对算法的某些特定步骤进行扩展或重写。这种设计模式提高了代码的复用性和可扩展性,使得代码结构更加清晰和易于维护。

对于初学者来说,理解并掌握模版方法设计模式的概念和用法,对于提高Java编程能力和编写高质量代码非常有帮助。通过实践和学习,你将能够更好地运用这种设计模式来解决实际问题,提升你的编程技能。


http://www.mrgr.cn/p/60888636

相关文章

问题:“git”不是内部命令

问题:明明刚安装完git,在使用git命令时却显示不是内部命令 因为没有配环境变量 1、找到git里的bin路径,复制2、打开电脑里的计算机=》属性=》高级系统设置,我的是系统=》系统信息=》高级系统设置选择环境变量环境变量有两处需要改的,用户变量和系统变量,先改用户变量 选中…

由于找不到msvcr120.dll,无法继续执行代码

在日常编程中,缺少关键的msvcr120.dll文件可能会导致代码无法执行,给我们带来不便。针对缺少msvcr120.dll文件的情况,我们可以采取一些有效的解决方法来解决这一问题。通过下载安装或使用Visual C Redistributable工具安装该msvcr120.dll文件…

【算法】前缀和

快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、一维前缀和二、二维前缀和三、寻找数值的中心下标四、除自身以外数组的乘积五、和为k的子数组六、和…

Java 循环语句

文章目录 Java 循环语句一,for 循环1. for 循环结构2. for 循环案例: 输出5行HelloWord3. for 循环案例: 写出输出的结果 (格式多样性)4. for 循环案例: 遍历100以内的偶数。并获取偶数的个数,获取所有的偶数的和5. for 循环案例: 输出所有的水仙花数6. …

179. 最大数(LeetCode)

文章目录 前言一、题目讲解二、算法原理三、代码编写1.仿函数写法2.lambda表达式 四、验证五.总结 前言 在本篇文章中,我们将会带着大家采用贪心的方法解决LeetCode中最大数这道问题!!! 一、题目讲解 一组非负整数,包…

iZotope RX 10 音频修复和增强工具 mac/win

iZotope RX 10 for Mac是一款出色的音频修复和增强工具,凭借其卓越的音频处理技术,能够轻松应对各种音频问题。 无论是背景噪音、回声还是失真,RX 10都能精准去除,还原清晰纯净的音频。同时,它还提供了丰富的增强工具&…

Linux的磁盘分区,格式化,挂载

1.需要提前添加几个磁盘,以做实验 2.把nvme0n2磁盘用来分区实验 3.分了一个主分区,和一个扩展分区(扩展分区是不能使用的,所以又在扩展分区里分了一个逻辑分区)分区的大小自己定义 4.格式化分出来的区,这…

abowman小宠物插件-博客园

首先进入abowmab右上角有很多宠物的选项(我选的是仓鼠)然后copy源码 <iframe width="400" height="300" frameborder="0" src="https://cdn.abowman.com/widgets/hamster/hamster.html?up_bgColor=ffffff&up_bodyColor=e6debe&…

AI大模型探索之路-训练篇3:大语言模型全景解读

文章目录 前言一、语言模型发展历程1. 第一阶段&#xff1a;统计语言模型&#xff08;Statistical Language Model, SLM&#xff09;2. 第二阶段&#xff1a;神经语言模型&#xff08;Neural Language Model, NLM&#xff09;3. 第三阶段&#xff1a;预训练语言模型&#xff08…

下载安装git

如何下载安装Git 一、去官网下载git git官网地址:https://git-scm.com/download 选择自己的系统下载PS:官网下载很慢,可以搜清华大学开源软件,选择适合自己的下载下载完成之后点击安装包安装二、开始安装配置 没啥好改的,一直点击“下一步”就好了选择安装的路径其他的一直…

日志分析-apache日志分析

简介 账号密码 root apacherizhi ssh root@IP 1、提交当天访问次数最多的IP,即黑客IP: 2、黑客使用的浏览器指纹是什么,提交指纹的md5: 3、查看index.php页面被访问的次数,提交次数: 4、查看黑客IP访问了多少次,提交次数: 5、查看2023年8月03日8时这一个小时内有多少IP…

jsp servlet 学生信息管理系统

一、角色划分 1、超级管理员 2、学生 二、模块展示 1、登录 2、列表页面【超级管理员展示所有用户信息、学生只展示当前登录用户信息】 3、新增 4、编辑 三、数据库【mysql】 四、运行演示 jsp servlet 学生信息管理系统

C语言操作符和关键字

文章目录 操作符单目操作符sizeof&#xff08;类型&#xff09;强制类型转换 关系操作符、逻辑操作符、条件操作符逗号表达式 常见关键字typedefstaticstatic修饰局部变量static修饰全局变量static修饰函数 register寄存器关键词define定义常量和宏 操作符 单目操作符 C语言中…

机器学习和深度学习-- 李宏毅(笔记与个人理解)Day22

Day 22 Transformer seqence to seqence 有什么用呢&#xff1f; Encoder how Block work 仔细讲讲Residual 的过程&#xff1f; 重构 Decoder - AutoRegressive Mask 由于是文字接龙&#xff0c;所以无法考虑右边的 info 另一种decoder Encoder to Decoder – Cross Attend…

[Vue warn]: Duplicate keys detected: item.id. This may cause an update error.

[Vue warn]: Duplicate keys detected: item.id. This may cause an update error.

vue之生命周期钩子

一、简单理解生命周期 Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程,我们可以通过生命周期钩子函数,在特定的生命周期阶段执行特定的操作。二、常见的生命周期钩子 1. beforeCreate:实例创建之初,此…

网络通信安全

一、网络通信安全基础 TCP/IP协议简介 TCP/IP体系结构、以太网、Internet地址、端口 TCP/IP协议简介如下&#xff1a;&#xff08;from文心一言&#xff09; TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;传输控制协议/网际协议&#xff0…

29.基础乐理-C大调也会用到黑键?

C大调也会运用到黑键&#xff1f;这个问题是在问&#xff0c;在一首注明为 某某大调 的音乐中&#xff0c;能够出现 某某大调 音阶中没有出现的音吗&#xff1f;比如C大调的音阶是 CDEFGAB&#xff0c;那C大调里 可以出现 升C、升D之类的音吗&#xff1f;再比如 D大调&#xff…

云服务器部署lucky配合frp实现域名访问本地Docker容器

云服务器部署lucky配合frp实现域名访问DX4600 FRP内网穿透可以看我这个帖子:https://www.cnblogs.com/snbg/p/18040720 操作流程(配置流程) 1.购买一个域名和服务器 2.配置云服务器 3.部署lucky实现域名访问 操作步骤(配置步骤) 一、购买一个域名和服务器 1.购买一个域名 …