小谈设计模式(11)—模板方法模式
小谈设计模式(11)—模板方法模式
- 专栏介绍
- 专栏地址
- 专栏介绍
- 模板方法模式
- 角色分类
- 抽象类(Abstract Class)
- 具体子类(Concrete Class)
- 抽象方法(Abstract Method)
- 具体方法(Concrete Method)
- 钩子方法(Hook Method)
- 核心思想
- Java代码实现
- 输出
- 分析
- 总结
专栏介绍
专栏地址
link
专栏介绍
主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
模板方法模式
这是一种行为型设计模式,用于定义算法的框架,将算法的具体实现延迟到子类中。
角色分类
抽象类(Abstract Class)
抽象类定义了一个模板方法,该方法包含了算法的框架,以及一系列基本方法的调用顺序。抽象类还可以定义抽象方法、具体方法和钩子方法,用于延迟具体实现或提供默认实现。
具体子类(Concrete Class)
具体子类继承抽象类,并实现抽象方法和钩子方法。具体子类负责实现算法的具体步骤。
抽象方法(Abstract Method)
抽象方法是在抽象类中声明的方法,由具体子类实现。抽象方法是模板方法中的基本方法,用于完成算法的一部分。
具体方法(Concrete Method)
具体方法是在抽象类中已经实现的方法,可以在模板方法中直接调用。具体方法是模板方法中的基本方法,用于完成算法的一部分。
钩子方法(Hook Method)
钩子方法是在抽象类中有默认实现的方法,子类可以选择是否覆盖。钩子方法可以用于在算法的不同阶段提供不同的行为。
核心思想
将算法的框架固定在抽象类中,而将具体实现延迟到具体子类中。抽象类定义了一个模板方法,该方法包含了算法的框架,以及一系列基本方法的调用顺序。抽象类还可以定义抽象方法、具体方法和钩子方法,用于延迟具体实现或提供默认实现。
Java代码实现
// 抽象模板类
abstract class AbstractClass {// 模板方法,定义了算法的骨架public final void templateMethod() {step1();step2();step3();}// 基本方法1protected abstract void step1();// 基本方法2protected abstract void step2();// 基本方法3protected abstract void step3();
}// 具体模板类A
class ConcreteClassA extends AbstractClass {@Overrideprotected void step1() {System.out.println("ConcreteClassA: Step 1");}@Overrideprotected void step2() {System.out.println("ConcreteClassA: Step 2");}@Overrideprotected void step3() {System.out.println("ConcreteClassA: Step 3");}
}// 具体模板类B
class ConcreteClassB extends AbstractClass {@Overrideprotected void step1() {System.out.println("ConcreteClassB: Step 1");}@Overrideprotected void step2() {System.out.println("ConcreteClassB: Step 2");}@Overrideprotected void step3() {System.out.println("ConcreteClassB: Step 3");}
}// 测试代码
public class Main {public static void main(String[] args) {AbstractClass classA = new ConcreteClassA();classA.templateMethod();System.out.println();AbstractClass classB = new ConcreteClassB();classB.templateMethod();}
}
输出
ConcreteClassA: Step 1
ConcreteClassA: Step 2
ConcreteClassA: Step 3ConcreteClassB: Step 1
ConcreteClassB: Step 2
ConcreteClassB: Step 3
分析
在上面的示例中,抽象模板类AbstractClass定义了一个模板方法templateMethod(),这个方法定义了一个算法的骨架,其中包含了多个基本方法step1()、step2()、step3()。具体模板类ConcreteClassA和ConcreteClassB继承自AbstractClass,并实现了基本方法。
总结
模板方法模式是一种简单但非常实用的设计模式,它通过将算法的框架固定在抽象类中,将具体实现延迟到具体子类中,提供了一种灵活而可扩展的算法设计方案。
相关文章:

小谈设计模式(11)—模板方法模式
小谈设计模式(11)—模板方法模式 专栏介绍专栏地址专栏介绍 模板方法模式角色分类抽象类(Abstract Class)具体子类(Concrete Class)抽象方法(Abstract Method)具体方法(C…...

C#程序中很多ntdll.dll、clr.dll的线程
如下图 需要“右键工程——调试——取消勾选‘启用本地代码调试’”即可。...

低代码工作流程管理系统:提升企业运营效率的利器
业务运营状况是否良好,除了人员需要配合以外,真正发挥作用的是背后的工作流程。将重复的工作进行自动化处理,确保这些流程最终指向同一个目标、实现一致的运营结果。而设计和实施不佳的工作流程则产生相反的效果——导致处理时间延长、运营成…...
HIVE SQL regexp_extract和regexp_replace配合使用正则提取多个符合条件的值
《平凡的世界》评分不错,《巴黎圣母院》改变成的电影不错,还有<<1984>>也蛮好看。 如何使用regexp_extract®exp_replace函数将以上文本中所有书籍名称都提取出来? select substr(regexp_replace(regexp_extract(regexp_…...
debian 安装matlab2022b报错解决方法与问题解决思路
报错 terminate called after throwing an instance of ‘std::runtime_error’ 在安装目录执行 ./bin/glnxa64/MATLABWindow通过执行以上命令发现是和libharfbuzz库有关。 该库在调用freetype库时,有方法找不到。 偿试remove freetype库,发现该库有大…...

Jenkins集成AppScan实现
一、Jenkins上安装插件 在Jenkins里安装以下插件 ibm-security-appscanstandard-scanner 二、打开AppScan 1、配置需要扫描的地址 配置需要扫描的地址 2、记录好要扫描的URL登录序列 记录好要扫描的URL登录序列 3、导出要扫描的URL登录序列设置 导出要扫描的URL登录序列设置 三…...

10.1 File类
前言: java.io包中的File类是唯一一个可以代表磁盘文件的对象,它定义了一些用于操作文件的方法。通过调用File类提供的各种方法,可以创建、删除或者重命名文件,判断硬盘上某个文件是否存在,查询文件最后修改时间&…...

[论文笔记]UNILM
引言 今天带来论文Unified Language Model Pre-training for Natural Language Understanding and Generation的笔记,论文标题是 统一预训练语言模型用于自然语言理解和生成。 本篇工作提出了一个新的统一预训练语言模型(Unifield pre-trained Language Model,UniLM),可以同…...

LLM之Colossal-LLaMA-2:Colossal-LLaMA-2的简介、安装、使用方法之详细攻略
LLM之Colossal-LLaMA-2:Colossal-LLaMA-2的简介、安装、使用方法之详细攻略 导读:2023年9月25日,Colossal-AI团队推出了开源模型Colossal-LLaMA-2-7B-base。Colossal-LLaMA-2项目的技术细节,主要核心要点总结如下: >> 数据处…...

国庆作业2
select实现服务器并发 代码: #include <myhead.h>#define ERR_MSG(msg) do{\printf("%d\n",__LINE__);\perror(msg);\ }while(0)#define PORT 8888#define IP "192.168.1.5"int main(int argc, const char *argv[]) {//创建流式套接字…...
fork仓库的代码如何同步主仓库代码
1.背景 我fork了一份 jekyll-theme-chirpy 仓库的代码(基于 jekyll 的自建博客仓库,可以免服务器),我需要在上面更新我的博客文章,但是我又想一直同步 jekyll-theme-chirpy 仓库的新功能,这样我可以更新自己的博客功能。所以我就…...

【Axure】元件库和母版、常见的原型规范、静态原型页面制作
添加现有元件库 点击元件库——载入 当然也可以创建元件库,自己画自己保存 建立京东秒杀母版 静态原型页面的制作 框架 选择以iphone8的界面大小为例,顶部状态栏高度为20 左侧类似于标尺,因为图标、文字离最左侧的间距是不一样的 信…...
在设备树中描述中断
参考文档: 内核 Documentation\devicetree\bindings\interrupt-controller\interrupts.txt 在设备树中,中断控制器节点中必须有一个属性: interrupt-controller,表明它是“中断控制器”。 还必须有一个属性: #interru…...

ccf_csp第一题汇总
ccf_csp第一题汇总 printf()输出格式大全(附 - 示例代码)现值计算AcWing 4699. 如此编码AcWing 4509. 归一化处理(小数位数根号函数)AcWing 4454. 未初始化警告AcWing 4280. 序列查询AcWing 4006. 数组推导(小陷阱)AcWing 3292. 称检测点查询AcWing 3287…...

uniapp 实现下拉筛选框 二次开发定制
前言 最近又收到了一个需求,需要在uniapp 小程序上做一个下拉筛选框,然后找了一下插件市场,确实有找到,但不过他不支持搜索,于是乎,我就自动动手,进行了二开定制,站在巨人的肩膀上&…...

实现单行/多行文本溢出
在日常开发展示页面,如果一段文本的数量过长,受制于元素宽度的因素,有可能不能完全显示,为了提高用户的使用体验,这个时候就需要我们把溢出的文本显示成省略号。 一. 单行文本溢出 即文本在一行内显示,超出…...
Spring Boot中的Binder类
介绍 Spring Boot中的Binder类是一个用于绑定属性的工具类。它可以将配置文件中的属性值绑定到Java对象中,从而方便地进行配置管理。 简单示例 import org.springframework.boot.context.properties.bind.Binder; import org.springframework.core.env.Environmen…...
leetcode之打家劫舍
leetcode 198 打家劫舍 leetcode 213 打家劫舍 II leetcode 337. 打家劫舍 III 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#…...

走进Spring的世界 —— Spring底层核心原理解析(一)
文章目录 前言一、Spring中是如何创建一个对象二、Bean的创建过程三、推断构造方法四、AOP大致流程五、Spring事务 前言 ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext("config.xml"); UserService userService (UserService) cont…...

快看看你的手机有没有:谷歌Android全面封杀此类软件!
谷歌坐不住了,因为Android应用商店中,充斥着大量可窃取用户数据的应用,所以必然要出手整治了。 一款名叫“SonicSpy”软件是整个事情的导火索,而该应用是典型的窃取用户数据的应用,其除了可以从手机中提取个人数据外&…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...

从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
js 设置3秒后执行
如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...