java设计模式(十三)模版方法模式(Template Method Pattern)

1、模式介绍:

模版方法模式是一种行为型设计模式,定义了一个操作中的算法框架,将一些步骤延迟到子类中实现。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

2、应用场景:

算法框架固定:当有一个算法有固定的框架但具体步骤可以有所不同时,可以使用模版方法模式。例如,开发一个网络库,其中连接、发送数据、关闭连接的顺序是固定的,但具体实现可能依赖于不同的网络协议。
代码复用:将公共操作抽象出来,避免代码重复。模版方法定义了算法的骨架,子类实现具体细节,提高了代码的复用性。
扩展性:通过模版方法模式,可以方便地扩展和修改算法的部分实现,而不需要修改整个算法的结构。

3、优点:

代码复用:将公共部分抽象到父类的模版方法中,避免重复代码。
灵活性:子类可以根据需要实现特定步骤,同时保持算法的整体结构不变。
扩展性:易于扩展新的算法步骤或者变体,通过子类扩展来实现。

4、缺点:

控制流程:模版方法模式在某种程度上限制了子类的灵活性,因为算法框架由父类控制,可能会导致类爆炸问题。
复杂性:过度使用模版方法可能会导致类的数量增多,增加代码复杂度。

5、代码示例:

/*** 抽象类:制作咖啡的模版** @author FM_南风* @date 2024/7/3*/
abstract class CoffeeTemplate {// 模版方法,定义咖啡的制作流程public final void makeCoffee() {boilWater();brewCoffeeGrinds();pourInCup();if (customerWantsCondiments()) {addCondiments();}}// 具体步骤的具体实现由子类提供abstract void brewCoffeeGrinds();abstract void addCondiments();// 公共步骤,具体实现是相同的void boilWater() {System.out.println("开水");}void pourInCup() {System.out.println("倒入杯中");}// 钩子方法,子类可以覆盖,控制算法的某些步骤boolean customerWantsCondiments() {return true;}
}/*** 具体类:制作咖啡** @author FM_南风* @date 2024/7/3*/
public class Coffee extends CoffeeTemplate{@Overridevoid brewCoffeeGrinds() {System.out.println("冲咖啡");}@Overridevoid addCondiments() {System.out.println("加糖和牛奶");}// 覆盖钩子方法,可以不加糖和牛奶@Overrideboolean customerWantsCondiments() {return false;}
}/*** 应用** @author FM_南风* @date 2024/7/3*/
public class TemplateMethodClient {public static void main(String[] args) {Coffee coffee = new Coffee();coffee.makeCoffee();}
}

6、结果展示:

示例说明:

在上面的例子中,CoffeeTemplate 是一个抽象类,定义了制作咖啡的模版方法 makeCoffee(),并包含了公共步骤和钩子方法。Coffee 类是具体的咖啡类型,实现了特定的 brewCoffeeGrinds()addCondiments() 方法,以及钩子方法 customerWantsCondiments() 的覆盖。通过模版方法模式,实现了制作咖啡的通用框架,同时具体的制作细节由子类决定。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Python酷库之旅-第三方库Pandas(013)

目录 一、用法精讲 31、pandas.read_feather函数 31-1、语法 31-2、参数 31-3、功能 31-4、返回值 31-5、说明 31-6、用法 31-6-1、数据准备 31-6-2、代码示例 31-6-3、结果输出 32、pandas.DataFrame.to_feather函数 32-1、语法 32-2、参数 32-3、功能 32-4、…

小白学c嘎嘎(第二天)入门基础下

温馨提醒:本篇文章起,文章内容排版将更新,层层深入 基础知识 回顾 引用的语法格式:类型& 引⽤别名 引⽤对象; 引用特性 1. 引⽤在定义时必须初始化 2. ⼀个变量可以有多个引⽤ 3. ⼀旦引⽤⼀个实体,再不…

android Dialog全屏沉浸式状态栏实现

在Android中,创建沉浸式状态栏通常意味着让状态栏背景与应用的主题颜色一致,并且让对话框在状态栏下面显示,而不是浮动。为了实现这一点,你可以使用以下代码片段: 1、实际效果图: 2、代码实现:…

【解读大模型(LLM)的token】

文末有福利! 当人们谈论大型语言模型的大小时,参数会让我们了解神经网络的结构有多复杂,而token的大小会让我们知道有多少数据用于训练参数。 正像陆奇博士所说的那样,大型语言模型为从文本生成到问题回答的各种任务提供了令人印象…

11410-00SF 同轴连接器

型号简介 11410-00SF是Southwest Microwave的连接器。该连接器的外壳采用优质不锈钢,材质为 CRES ALLOY UNS-S303500,符合 ASTM-A582 标准。首先,不锈钢材料经过锻造加工,形成转接器的基本形状。然后,外壳进行精密的 C…

雷池WAF动态防护功能初体验

一、 介绍 大名鼎鼎的雷池WAF最近新上了个名为 动态防护 的功能 所谓动态防护,是在用户浏览到的网页内容不变的情况下,将网页赋予动态特性,即使是静态页面,也会具有动态的随机性。 说白了就是给你网站的 html 和 js 代码加上加密…

WEB安全:网络安全常用术语

一、攻击类别 漏洞:硬件、软件、协议,代码层次的缺陷。 后⻔:方便后续进行系统留下的隐蔽后⻔程序。 病毒:一种可以自我复制并传播,感染计算机和网络系统的恶意软件(Malware),它能损害数据、系统功能或拦…

浅谈“不要卷模型,要卷应用”

目录 1.概述 2.AI技术应用场景探索 3.避免超级应用陷阱的策略 3.1.追求DAU的弊端 3.2.平衡用户活跃度与应用实用性的策略 4.个性化智能体开发 4.1. 用户需求分析与数据收集 4.2. 技术选择与开发 4.3. 个性化算法设计 4.4. 安全性与隐私保护 4.5. 多渠道集成与响应机…

防火墙安全策略用户认证综合实验

目录 一、拓扑图 二、实验要求 三、实验步骤 步骤1:配置防火墙接口 步骤2:配置ISP 步骤3:配置交换机LSW1 步骤4:配置PC端、客户端、服务器端 需求1:针对访问DMZ区内的服务器 ​编辑测试需求1: 需求2&#xff…

transformer维度变化,图中直观表现

transformer维度变化,图中直观表现 Transformer分为两阶段:训练,推理:训练阶段:Encoder部分:Decoder部分: 推理阶段:训练阶段图片推理阶段图片 Transformer分为两阶段:训…

WPF界面设计-更改按钮样式 自定义字体图标

一、下载图标文件 iconfont-阿里巴巴矢量图标库 二、xaml界面代码编辑 文件结构 &#xe653; 对应的图标代码 Fonts/#iconfont 对应文件位置 <Window.Resources><ControlTemplate TargetType"Button" x:Key"CloseButtonTemplate"…

Web3D技术应用在什么场景,能给企业带来什么价值?

Web3D现在已经在很多行业和领域应用了&#xff0c;以 博维数孪 行业用户为例&#xff0c;它能够为企业带来一系列价值&#xff1a; 1、电商领域&#xff1a;在电商中&#xff0c;Web3D技术可以提供3D商品展示&#xff0c;让消费者能够全面了解商品的每一个细节&#xff0c;并且…

【高中数学/幂函数】比较a=2^0.3,b=3^0.2,c=7^0.1的大小

【问题】 比较a2^0.3,b3^0.2,c7^0.1的大小 【解答】 a2^0.32^3/10(2^3)^1/108^1/10 b3^0.23^2/10(3^2)^1/109^1/10 c7^0.17^1/10 由于yx^1/10在x正半轴是增函数&#xff0c;底数大的得数就大。 因为9>8>7,所以b>a>c 【图像】 在图像上绘出曲线yx^1/10&…

从数据仓库到数据湖(上):数据湖导论

文章目录 一、什么是数据湖&#xff1f;起源数据湖的特征 二、为什么要用数据湖&#xff1f;三、数据湖与数据仓库的区别数据仓库和数据湖的对比 四、数据湖本质数据存储架构数据处理工具&#xff1a;三类第一类工具第二类工具第三类工具 小结 五、总结六、参考资料 一、什么是…

K8s GPU 资源管理探索:在 KubeSphere 上部署 AI 大模型 Ollama

作者&#xff1a;运维有术星主 随着人工智能、机器学习、AI 大模型技术的迅猛发展&#xff0c;我们对计算资源的需求也在不断攀升。特别是对于需要处理大规模数据和复杂算法的 AI 大模型&#xff0c;GPU 资源的使用变得至关重要。对于运维工程师而言&#xff0c;掌握如何在 Kub…

发送手机,邮箱验证码

一、发送邮箱&#xff0c;使用hutool工具包 使用aliyun邮箱作为发件邮箱&#xff0c;需要在邮箱中开启代收功能 1、引入依赖 userController代码 GetMapping("/sendCodeEmail")public Integer sendCodeEmail(String mel){return userService.sendCodeEmail(mel);} …

!vue3中defineEmits接收父组件向子组件传递方法,以及方法所需传的参数及类型定义,避免踩坑!

使用说明 1、在子组件中调用defineEmits并定义要发射给父组件的方法 const emits defineEmits([‘foldchange’]) 2、使用defineEmits会返回一个方法&#xff0c;使用一个变量emits(变量名随意)去接收 3、在子组件要触发的方法中&#xff0c;调用emits并传入发射给父组件的方法…

绝地归来!英伟达等提出JeDi:无需微调,个性化图像生成新SOTA![CVPR 2024]

文章链接&#xff1a;https://arxiv.org/pdf/2407.06187 github链接&#xff1a;https://research.nvidia.com/labs/dir/jedi 本文提出了一种无需微调的文本生成图像方法&#xff0c;采用了新颖的联合图像扩散模型。 提出了一种简单且可扩展的数据合成流程&#xff0c;用于生成…

Quartz 核心

一、Quartz 核心 工作原理&#xff1a; Scheduler 是一个计划调度器容器&#xff08;总部&#xff09;&#xff0c;容器里面可以盛放众多的 JobDetail 和 Trigger。当容器启动后&#xff0c;里面的每个 JobDetail 都会根据 Trigger 按部就班自动去执行。JobDetail 是一个可执…

Canvas:掌握图像变换合成与裁剪状态像素操作

想象一下&#xff0c;用几行代码就能创造出如此逼真的图像和动画&#xff0c;仿佛将艺术与科技完美融合&#xff0c;前端开发的Canvas技术正是这个数字化时代中最具魔力的一环&#xff0c;它不仅仅是网页的一部分&#xff0c;更是一个无限创意的画布&#xff0c;一个让你的想象…