【设计模式】行为型设计模式之 模板方法模式
介绍
GOF 定义
模板方法模式 Template Method Design Pattern :模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中去实现;模板方法在不改变算法整体结构·的情况下,可以重新定义算法中的某些步骤。
代码举例
public abstract class AbstractClass{//算法框架方法,使用final避免子类重写public final void templateMethod(){...method1();...method2();}//使用protect保证子类可见,包外不可见protect abstract void method1();//使用protect abstract void method2();
}public class ConcreteClass2 extends AbstractClass{@Overrideprotected void method1(){...具体实现}@Overrideprotected void method2(){...具体实现}
}
应用案例
模板方法的作用 1:复用
InputStream 的案例
InputStream 中有一个模板方法,方法签名是read(byte[],int off,int len);其中包含一个抽象方法 read()的调用,这个方法则留待子类去实现。实现了方法 read(byte[],int off,int len); 的复用,不需要每个子类都重复实现。
Java AbstractList 的案例
AbstractList 中的 addAll 方法中调用了 add 方法,这就是一个模板方法,add 的具体实现依赖于子类的实现。虽然 AbstractList 中没有将 add 方法声明为抽象,但是 add 方法在 AbstractList 中直接抛出了异常
public boolean addAll(int index, Collection<? extends E> c) {rangeCheckForAdd(index);boolean modified = false;for (E e : c) {add(index++, e);modified = true;}return modified;
}public void add(int index, E element) {throw new UnsupportedOperationException();
}
模板方法的作用 2:拓展点
模板方法还可以用作框架的拓展点,例如 Spring MVC WEB 开发中底层使用的 Servlet 技术
直接使用 Servlet 开发时继承 HttpServlet 类后,手写 doGet 和 doPOst 方法。然后服务请求进入 Servlet 时实际上调用的 service 方法。这个 service 方法就可以看做一个模板方法。
模板方法与回调的对比
相同点
回调方法与模板方法的应用场景几乎一致,都是在一个大的算法框架中自由替换其中的某个步骤,起到代码复用和拓展的作用。
不同点
- 回调基于组合关系,而模板方法基于继承实现
- 回调的组合关系更加灵活
- Java 语言的单继承限制
- 回调可以使用匿名类,Lambda 表达式来传递代码。但是模板方法必须定义子类
- 模板方法不够灵活,如果有多个模板方法和其待实现方法则实现子类必须都实现一遍。
总结
优点
- 提高代码复用:不变的部分集中在父类,减少代码重复。
- 提高扩展性:新增子类时,只需实现特定的方法,无需改动模板方法。
- 保证一致性:确保算法的整体结构稳定,即使在子类中修改了某些步骤。
缺点
- 过度使用可能导致类结构复杂,特别是继承层次过深时。
- 对于不需要重用算法结构的情况,引入模板方法可能会增加不必要的抽象。
相关文章:
【设计模式】行为型设计模式之 模板方法模式
介绍 GOF 定义 模板方法模式 Template Method Design Pattern :模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中去实现;模板方法在不改变算法整体结构的情况下,可以重新定义算法中的某些步骤。 代码举例 …...
智能合约中断言失败
断言失败: 断言(assert)在智能合约中用于确保内部逻辑的一致性和正确性,但如果使用不当,确实可能导致意外的合约终止或资金锁定。这是因为assert主要用于检测程序内部的错误,例如算法错误或逻辑错误&#…...
flink读取hive写入http接口
目录 0、创建hive数据 1、pom.xml 2、flink代码 3、sink 4、提交任务jar 5、flink-conf.yaml 6、数据接收 flink-1.17.2jdk1.8hive-3.1.3hadoop3.3.6passwordhttp0、创建hive数据 /cluster/hive/bin/beeline !connect jdbc:hive2://ip:10000 create database demo; d…...
【论文阅读】MODELING AND SOLVING THE TRAVELING SALESMAN PROBLEM WITH PRIORITY PRIZES
文章目录 论文基本信息摘要1.引言2. INTEGER QUADRATIC PROGRAM FOR TSPPP3. MIXED INTEGER LINEAR PROGRAMS FOR TSPPP4. TABU SEARCH ALGORITHM FOR TSPPP5. COMPUTATIONAL RESULTS6. CONCLUDING REMARKS补充 论文基本信息 《MODELING AND SOLVING THE TRAVELING SALESMAN P…...
【CS.SE】使用 docker pull confluentinc/cp-kafka 的全面指南
文章目录 1 引言2 准备工作2.1 安装 Docker2.1.1 在 Linux 上安装 Docker2.1.2 在 macOS 上安装 Docker2.1.3 在 Windows 上安装 Docker 2.2 验证 Docker 安装 3 拉取 confluentinc/cp-kafka Docker 镜像3.1 拉取镜像3.2 验证镜像 4 运行 Kafka 容器4.1 启动 ZooKeeper4.2 启动…...
STM32快速入门(ADC数模转换)
STM32快速入门(ADC数模转换) 前言 ADC数模转换存在的意义就是将一些温度传感器、各自数据传感器产生的模拟信号转换成方便识别和计算的数字信号。 导航 图24 通用定时器框图: 图片截取自STM32 F1XX中文参考手册。还是以框图为中心&#x…...
Linux环境在非root用户中搭建(java-tomcat-redis)
注: 本文在内网(离线)环境,堡垒机中搭建,服务器不同可能有所差异,仅供参考 本文安装JDK-20.0.1版本,apache-tomcat-10.1.10版本,redis-6.2.15版本 本文服务器IP假设:192.168.88.133 root用户创建子用户并…...
Unity 之 代码修改材质球贴图
Unity 之 代码修改材质球贴图 代码修改Shader:ShaderGraph:材质球包含属性 代码修改 meshRenderer.material.SetTexture("_Emission", texture);Shader: ShaderGraph: 材质球包含属性 materials[k].HasProperty("…...
spark-3.5.1+Hadoop 3.4.0+Hive4.0 分布式集群 安装配置
Hadoop安装参考: Hadoop 3.4.0HBase2.5.8ZooKeeper3.8.4Hive4.0Sqoop 分布式高可用集群部署安装 大数据系列二-CSDN博客 一 下载:Downloads | Apache Spark 1 下载Maven – Welcome to Apache Maven # maven安装及配置教程 wget https://dlcdn.apache.org/maven/maven-3/3.8…...
Matlab实现GWO-CNN-LSTM-Mutilhead-Att灰狼算法卷积长短期记忆神经网络融合多头注意力机制预测 SCI顶级优化
数据预处理:准备和清理数据,包括数据的加载、特征提取、归一化等。 GWO (灰狼算法) 的实现:根据灰狼算法的原理和公式,编写 MATLAB 代码来初始化灰狼群体、计算适应度函数、更新位置等。 CNN (卷积神经网络) 的构建:使…...
RTKLIB之RTKPLOT画图工具
开源工具RTKLIB在业内如雷贯耳,其中的RTKPLOT最近正在学习,发现其功能之强大,前所未见,打开了新的思路。 使用思博伦GSS7000卫星导航模拟器,PosApp软件仿真一个载具位置 1,RTKPLOT支持DUT 串口直接输出的NMEA数据并…...
本地部署 RAGFlow
本地部署 RAGFlow 0. RAGFlow 是什么?1. 安装 wsl-ubuntu2. (可选)配置清华大学软件源3. 系统更新和安装构建工具4. 安装 Miniconda35. 安装 CUDA Toolkit6. 安装 git lfs7. 配置 Hugging Face 的缓存路径8. 配置 vm.max_map_count9. 安装 Docker Engine10. 安装 nginx11. 本地…...
php常用数据库操作
文章目录 PHP操作1. mysqli_connect() 连接数据库2. mysqli_close() 关闭数据库3. mysqli_num_rows 查询结果集中的行数4. mysqli_select_db 选择数据库的函数5. mysqli_query 常规的插入查找等6. header( )7.防止 sql 注入 PHP操作 1. mysqli_connect() 连接数据库 2. mysql…...
判断经纬度是否在某个城市内
一、从高德获取指定城市边界经纬度信息 通过apifox操作: 二、引入第三方jar包: maven地址:https://mvnrepository.com/ maven依赖: <dependency><groupId>org.locationtech.jts</groupId><artifactId>…...
Java——数组排序和查找
一、排序介绍 1、排序的概念 排序是将多个数据按照指定的顺序进行排列的过程。 2、排序的种类 排序可以分为两大类:内部排序和外部排序。 3、内部排序和外部排序 1)内部排序 内部排序是指数据在内存中进行排序,适用于数据量较小的情况…...
Flutter中防抖动和节流策略
什么是防抖和节流? 函数节流(throttle)与 函数防抖(debounce)都是为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象 是应对频…...
设计模式-中介者(调停者)模式(行为型)
中介者模式 中介者模式是一种行为型模式,又叫调停者模式,它是为了解决多个对象之间,多个类之间通信的复杂性,定义一个中介者对象来封装一些列对象之间的交互,使各个对象之间不同持有对方的引用就可以实现交互…...
HC-05蓝牙模块配置连接和使用
文章目录 1. 前期准备 2. 进入AT模式 3. 电脑串口配置 4. 配置过程 5. 主从机蓝牙连接 6. 蓝牙模块HC-05和电脑连接 1. 前期准备 首先需要准备一个USB转TTL连接器,电脑安装一个串口助手,然后按照下面的连接方式将其相连。 VCCVCCGNDGNDRXDTXDTXD…...
云上小知识:企业选择云服务的小Tips
企业在选择云服务模式时,应综合考虑以下几个关键因素: 1. 业务需求与场景 企业需要根据自身的业务特点和需求来选择合适的云服务模式。例如,如果企业的用户分布广泛,需要跨地域提供服务,那么公有云可能是更好的选择。…...
生成式人工智能 - Stable Diffusion 都使用了哪些技术?
一、Stable Diffusion简述 1、简述 Stable Diffusion在2022年8月开源,是由慕尼黑大学的CompVis研究团队开发的生成式人工神经网络。该项目由初创公司StabilityAI、CompVis和Runway合作开发,并得到了EleutherAI和LAION的支持。截至2022年10月,StabilityAI已筹集了1.01亿美元…...
FanControl深度解析:解锁Windows风扇控制的专业级配置哲学
FanControl深度解析:解锁Windows风扇控制的专业级配置哲学 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendin…...
CANN/GE动态输入算子样例
样例使用指导 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前…...
5分钟掌握Typora插件:从文件管理小白到高效写作达人的3步法
5分钟掌握Typora插件:从文件管理小白到高效写作达人的3步法 【免费下载链接】typora_plugin Typora plugin. Feature enhancement tool | Typora 插件,功能增强工具 项目地址: https://gitcode.com/gh_mirrors/ty/typora_plugin 你是否曾在Typora…...
5G网络中的存储功能革新:NRF技术深度解析
5G网络中的存储功能革新:NRF技术深度解析 在5G通信技术的快速发展浪潮中,网络功能虚拟化(NFV)与软件定义网络(SDN)作为两大核心支柱,正引领着网络架构的深刻变革。其中,网络存储功能…...
终极指南:用ncmdump彻底解决网易云音乐NCM格式限制
终极指南:用ncmdump彻底解决网易云音乐NCM格式限制 【免费下载链接】ncmdump ncmdump - 网易云音乐NCM转换 项目地址: https://gitcode.com/gh_mirrors/ncmdu/ncmdump 在数字音乐时代,格式兼容性已成为音乐爱好者面临的核心挑战。当你从网易云音乐…...
AI绘画工作流自动化:从NovelAI到Pixiv的Semi-Auto工具实战
1. 项目概述:从手动到自动,解放AI绘画生产力的桌面利器如果你和我一样,是个深度沉迷于AI绘画的创作者,那你一定经历过这样的痛苦:在NovelAI的WebUI里,吭哧吭哧地调好一组参数,生成一张图&#x…...
别再死记硬背了!手把手带你用Vivado SDK调试ZYNQ FSBL源码(附常见启动失败排查)
深入实战:用Vivado SDK调试ZYNQ FSBL源码的完整指南 在嵌入式系统开发中,理解启动流程是掌握整个系统运行机制的关键。对于Xilinx ZYNQ平台而言,First Stage Boot Loader(FSBL)作为系统启动的第一环,其重要…...
XYBot V2:基于Python的插件化微信机器人框架开发与部署指南
1. 项目概述:一个功能丰富的微信机器人框架最近在折腾一个挺有意思的开源项目,叫XYBot V2。简单来说,它是一个基于Python的微信机器人框架,能让你在微信里实现各种自动化交互和趣味功能。项目作者HenryXiaoYang已经声明因个人原因…...
AXI4协议实战:从零构建一个支持突发传输的从机接口
1. AXI4协议基础与从机接口设计概述 AXI4协议作为AMBA总线家族中最核心的成员,已经成为现代SoC设计中事实上的标准互联规范。我第一次接触AXI4是在2015年设计图像处理芯片时,当时为了连接DMA控制器和DDR控制器,不得不硬着头皮研究这个看似复杂…...
