模板方法模式:优雅封装算法骨架

目录

一、模板方法模式

1、结构

2、特性

3、优缺点

3.1、优点

3.2、缺点

4、使用场景

5、实现示例

5.1、抽象类

5.2、实现类

5.3、测试类


一、模板方法模式

模板方法模式(Template Method Pattern)是一种行为设计模式,它在一个方法中定义了一个算法的骨架,而将一些步骤的实现延迟到子类中。

通过这种方式,模板方法模式可以将步骤的执行顺序控制在父类中,同时允许子类覆盖特定步骤的实现以满足具体需要。


1、结构

模板方法模式包含以下主要角色:

  1. 抽象类(Abstract Class)

    • 定义抽象的基本操作,子类将重定义它们以实现算法的特定步骤

    • 实现一个模板方法,定义算法的骨架

  2. 具体类(Concrete Class)

    • 实现基本操作以完成算法中与特定子类相关的步骤

2、特性

    固定算法结构:模板方法通过定义算法的骨架,确保算法的固定执行顺序。
    可扩展步骤:子类可以覆盖父类中定义的抽象方法,从而扩展或修改某些步骤,而不影响整体算法的结构。
    不可变模板方法:模板方法通常使用 final 修饰,这样子类就不能重写这个方法,从而保证了算法骨架的稳定性。

3、优缺点


3.1、优点

    代码复用:通过在抽象类中定义公用的算法结构,可以减少代码重复,提高代码复用性。
    灵活性和可扩展性:子类可以根据具体需求覆盖抽象方法,从而实现不同的具体行为,这提高了系统的灵活性和可扩展性。
    控制反转:模板方法模式实现了一种变相的控制反转,由父类调用子类实现的具体方法,减少了子类对父类的依赖。

3.2、缺点

    过度设计:如果算法步骤很简单或变化不大,使用模板方法模式可能导致过度设计,引入不必要的复杂性。
    实现不直观:模板方法模式涉及继承和多态,对某些人来说可能不是特别直观,需要详细文档说明才能正确理解和使用。

4、使用场景

  1. 一次性实现算法的不变部分,将可变部分留给子类实现

  2. 各子类中公共的行为应被提取出来集中到公共父类中

  3. 控制子类扩展,只允许在特定点进行扩展

5、实现示例


5.1、抽象类
 
/*** 抽象类 - 饮料制作模板* 定义了制作饮料的算法骨架*/
public abstract class BeverageTemplate {// 模板方法 - 定义制作饮料的步骤(算法骨架)public final void prepareBeverage() {boilWater();brew();pourInCup();if (customerWantsCondiments()) {addCondiments();}}// 具体方法 - 烧水(所有饮料都一样)private void boilWater() {System.out.println("烧开水");}// 具体方法 - 倒入杯子(所有饮料都一样)private void pourInCup() {System.out.println("将饮料倒入杯子");}// 抽象方法 - 冲泡(由子类实现)protected abstract void brew();// 抽象方法 - 添加调料(由子类实现)protected abstract void addCondiments();// 钩子方法 - 顾客是否要加调料(默认返回true,子类可覆盖)protected boolean customerWantsCondiments() {return true;}
}
5.2、实现类

具体子类 - 咖啡

/*** 具体子类 - 咖啡*/
public class Coffee extends BeverageTemplate {@Overrideprotected void brew() {System.out.println("冲泡咖啡粉");}@Overrideprotected void addCondiments() {System.out.println("加入糖和牛奶");}// 覆盖钩子方法 - 询问用户是否要加调料@Overrideprotected boolean customerWantsCondiments() {String answer = getUserInput();return answer.toLowerCase().startsWith("y");}}

具体子类 - 茶

/*** 具体子类 - 茶*/
public class Tea extends BeverageTemplate {@Overrideprotected void brew() {System.out.println("浸泡茶叶");}@Overrideprotected void addCondiments() {System.out.println("加入柠檬");}// 覆盖钩子方法 - 茶默认不加调料@Overrideprotected boolean customerWantsCondiments() {return false;}
}

5.3、测试类

public class BeverageTest {public static void main(String[] args) {System.out.println("======= 制作咖啡 =======");BeverageTemplate coffee = new Coffee();coffee.prepareBeverage();System.out.println("\n======= 制作茶 =======");BeverageTemplate tea = new Tea();tea.prepareBeverage();}
}

结果:

======= 制作咖啡 =======
烧开水
冲泡咖啡粉
将饮料倒入杯子
您的咖啡要加糖和牛奶吗 (y/n)? y
加入糖和牛奶======= 制作茶 =======
烧开水
浸泡茶叶
将饮料倒入杯子

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

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

相关文章

韦东山STM32_HAl库入门教程(SPI)学习笔记[09]内容

(1)SPI程序层次一、核心逻辑:“SPI Flash 操作” 是怎么跑起来的?要读写 SPI Flash,需同时理解 硬件连接(怎么接线) 和 软件分层(谁负责发指令、谁负责控制逻辑)&#xf…

线上Linux服务器的优化设置、系统安全与网络安全策略

一、Linux服务器的优化设置 线上Linux的优化配置序号基础优化配置内容说明1最小化安装系统【仅安装需要的,按需安装、不用不装】,必须安装的有基本开发环境、基本网络包、基本应用包。2ssh登录策略优化 Linux服务器上的ssh服务端配置文件是【/et…

基于人眼视觉特性的相关图像增强基础知识介绍

目录 1. 传统的灰度级动态范围优化配置方法 2.基于视觉特性的灰度级动态范围调整优化 1. 传统的灰度级动态范围优化配置方法 传统的灰度级动态范围调整方法主要包括线性动态范围调整及非线性动态 范围调整。线性动态范围调整是最简单的灰度级动态范围调整方法,观察…

Selenium使用超全指南

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快概述selenium是网页应用中最流行的自动化测试工具,可以用来做自动化测试或者浏览器爬虫等。官网地址为:相对于另外一款web自动化测试工具QT…

Go通道操作全解析:从基础到高并发模式

一、channel类型 Go 语言中的通道(channel)是一种特殊的类型。它类似于传送带或队列,遵循先进先出(FIFO)原则,确保数据收发顺序的一致性。每个通道都是特定类型的导管,因此在声明时必须指定其元素类型。 channel是一种类型, 一种引用类型。 声明通道类型的格式如下:…

Linux网络--1、网络基础

目录 一、网络发展 二、理解分层 2.1OSI七层模型 2.2TCP/IP分层模型 2.3分层的好处 三、认识协议 3.1初步认识 3.2了解指定组织 3.3具体协议理解 3.3.1是什么 3.3.2为什么 3.3.3与OS的关系 3.4总结 四、网络传输流程 4.1局域网网络传输 4.1.1通信过程 4.1.2概念解析 4.2跨网…

前端视角下关于 WebSocket 的简单理解

参考 RFC 6455: The WebSocket Protocol WebSocket 协议基础 协议本质:在单个 TCP 连接上提供全双工通信通道的协议核心优势: 双向实时通信(服务器主动推送)低延迟(相比 HTTP 轮询)高效数据传输&#xff0…

自动化一键部署 LNMP 环境

第一步:准备环境 & 准备脚本文件1. 你在 CentOS 7 的服务器/虚拟机里打开终端,确认你有 root 权限或者能用 sudo。输入下面命令确认你的系统版本:cat /etc/centos-release你应该看到类似:CentOS Linux release 7.9.2009 (Core…

react之React.cloneElement()

react提供的这个方法克隆组件的方法,可能我们在平常的开发中用的很少,主要可能是我们并不知道或者并不了解这个方法。因为我在之前react的children文章中用到过,所以我就进行了一系列的测试,发现真的非常的好用。我们同样使用一些…

学习Java的Day27

今天学习的主要内容是在IntelliJ IDEA开发环境中,通过部署Tomcat服务器并连接MySQL数据库,实现了一个完整的留言板系统。这个项目涵盖了前后端开发的全流程,具体包括以下关键环节:开发环境搭建使用IntelliJ IDEA Ultimate版&#…

【计算机网络 | 第3篇】物理媒介

文章目录物理媒介介绍与物理媒体的分类🥝成本考量引导型传输媒体🍋引导型传输媒体:双绞线🍋‍🟩双绞线类别双绞线的发展历程双绞线的物理限制引导型传输媒体:同轴电缆🍋‍🟩结构组成…

golang的切片

切片 为什么需要切片 用于元素的个数不确定,所以无法通过数组的形式来进行统计。此时就需要切片 切片,也因此可以粗略地理解为动态数组数组的长度不能用变量来确定,这时候切片slice也就派上用场了 切片地基本介绍 切片的英文是slice切片是数组…

在labview中实现视频播放

这里分享一个迅雷的视频播放控件APlayer,非常的好用。具体操作步骤如下: 1.下载控件: 首先下载http://aplayer.open.xunlei.com/codecs.zip,将codecs文件解压后打开,按快捷键contrlA,随后contrlc复制里面所有的文件;…

ubuntu 22.04 使用yaml文件 修改静态ip

前提: 启动服务 sudo systemctl start systemd-networkd 设置开机自启 sudo systemctl enable systemd-networkd 检查状态(确保显示 active (running)) sudo systemctl status systemd-networkd 若想停止: 停止当前运行的服务 sud…

闸机控制系统从设计到实现全解析:第 4 篇:Redis 缓存与分布式锁实现

第 4 篇:Redis 缓存与分布式锁实现 一、Redis 在系统中的核心作用票证信息缓存:将高频访问的票证数据(如状态、有效期)缓存至 Redis,减少数据库查询,提升验证响应速度。分布式锁:在高并发场景下…

北京天津唐山廊坊沧州打捞日记

北京天津唐山廊坊沧州打捞日记 打捞搜蚯蚓疏通 北京:护城河畔的情谊打捞 清晨,北京的护城河在朝阳的映照下泛着微光。我接到一位年轻小伙的电话,声音中满是焦急。原来,他与女友在河边约会时,不小心将女友送他的定情玉佩…

全志刷机工具:PhoenixSuit-全志芯片处理器-刷机工具安装包及最详细使用教程指南

全志刷机工具:PhoenixSuit-全志芯片处理器刷机工具安装包及最详细使用教程指南,此文章主要是分享机顶盒、电视盒子,全志芯片盒子(其中包含全志处理器、全志芯片、全志CPU等等)的刷机工具、刷机工具安装教程以及如何使用…

浅谈 VM 桥接模式:让虚拟机像真实电脑一样接入网络

在虚拟化环境中,虚拟机(Virtual Machine, VM)与外部网络之间的通信方式有多种,比如 NAT 模式、Host-Only 模式、桥接模式(Bridged Networking) 等。其中,桥接模式是最接近“真实物理机”网络行为…

计算机视觉(1)-图像采集设备选型全景表(工业 + 医疗 + 车载)

图像采集设备选型全景表(工业 医疗 车载)一份面向工程师的“场景—设备—协议”速查表1 工业 & 医疗 & 通用场景应用场景主流设备形态接口 / 协议典型性能突出优势致命短板动态范围工业检测AOI / 量测 / 缺陷工业相机 采集卡Camera Link HSCo…

计算机视觉(3)深度学习模型部署平台技术选型与全栈实践指南

一、部署平台概述与分类 深度学习模型部署平台的分类需兼顾技术特性与应用场景的适配性,基于“技术定位-场景适配”双维度分类法,可将其划分为通用开源框架、云厂商服务及专用边缘工具三大类,各类别在设计目标、核心能力与场景覆盖上呈现显著…