十五、模板方法模式
一、什么是模板方法模式
模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
模板方法模式包含以下主要角色。
① 抽象类/抽象模板(Abstract Class),负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。这些方法的定义如下。
- 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
- 基本方法:是整个算法中的一个步骤。
② 具体子类/具体实现(Concrete Class),实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。
二、模板方法模式的实现
- 抽象类(Abstract Class)
/*** @author FluffyCatkin* @version 1.0* @date 2020/1/6 0006 17:23* @description 抽象类(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。* 这些方法的定义如下。* ① 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。** ② 基本方法:是整个算法中的一个步骤,包含以下几种类型。* 抽象方法:在抽象类中申明,由具体子类实现。* 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。* 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。*/
public abstract class AbstractClass {public void method(){action1();action2();if (action3()){action4();}action5();}protected abstract void action5();private void action4(){System.out.println("action4................");};protected abstract boolean action3();protected abstract void action2();private void action1(){System.out.println("action1................");};}
- 具体子类(Concrete Class)
/*** @author FluffyCatkin* @version 1.0* @date 2020/1/6 0006 17:28* @description 具体子类(Concrete Class):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。*/
public class ConcreteClass extends AbstractClass {@Overrideprotected void action5() {System.out.println("extends....action5.............");}@Overrideprotected boolean action3() {return false;}@Overrideprotected void action2() {System.out.println("extends....action2.............");}
}
- 测试类
/*** @author FluffyCatkin* @version 1.0* @date 2020/1/6 0006 17:21* @description 模版方法模式** 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。** 例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。** 这样的例子在生活中还有很多,例如,一个人每天会起床、吃饭、做事、睡觉等,其中“做事”的内容每天可能不同。我们把这些规定了流程或格式的实例定义成模板,允许使用者根据自己的需求去更新它,例如,简历模板、论文模板、Word 中模板文件等。** 以下介绍的模板方法模式将解决以上类似的问题。* 模式的定义与特点:* 模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。** 该模式的主要优点如下:* 它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。* 它在父类中提取了公共的部分代码,便于代码复用。* 部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。** 该模式的主要缺点如下:* 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。* 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。* 模式的结构与实现:* 模板方法模式需要注意抽象类与具体子类之间的协作。它用到了虚函数的多态性技术以及“不用调用我,让我来调用你”的反向控制技术。现在来介绍它们的基本结构。* 模式的结构:* 模板方法模式包含以下主要角色。* (1) 抽象类(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。这些方法的定义如下。* ① 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。* ② 基本方法:是整个算法中的一个步骤,包含以下几种类型。抽象方法:在抽象类中申明,由具体子类实现。* 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。* 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。* (2) 具体子类(Concrete Class):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤**/
public class Main {@Testpublic void templateMethodMode(){AbstractClass concreteClass = new ConcreteClass();concreteClass.method();}
}
运行结果:
action1................
extends....action2.............
extends....action5.............Process finished with exit code 0
三、应用场景
模板方法模式通常适用于以下场景:
- 算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。
- 当多个子类存在公共的行为时,可以将其提取出来并集中到一个公共父类中以避免代码重复。首先,要识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
- 当需要控制子类的扩展时,模板方法只在特定点调用钩子操作,这样就只允许在这些点进行扩展。
四、优缺点分析
模板方法模式的主要优点如下:
- 它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
- 它在父类中提取了公共的部分代码,便于代码复用。
- 部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。
模板方法模式的主要缺点如下:
- 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象,间接地增加了系统实现的复杂度。
- 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。
- 由于继承关系自身的缺点,如果父类添加新的抽象方法,则所有子类都要改一遍。
代码地址:https://gitee.com/fluffycatkin/JavaDesignModel.git

原文出处:http://c.biancheng.net/view/1376.html
相关文章:
十五、模板方法模式
一、什么是模板方法模式 模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 模板方法模式包含以…...
jvm 什么是常量池,常量池定义 class常量池
首先需要理解下Java的class文件,以及class文件结构: 1.Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文 件之中,中间没有任何分隔符,这使得整个Class文件中存储的内容几乎全部…...
CA证书颁发机构服务器
目录 一、CA证书颁发机构是什么? 二、数字证书可以干什么? 三、PKI:即公钥加密体系(public key cryptography) 四、CA在网络中的工作流程及原理(以网站为例) 五、HTTPS 的工作原理 六、CA私有证…...
5. 线性层及其他层
5.1 神经网络结构 5.2 线性拉平 import torch import torchvision from torch import nn from torch.nn import ReLU from torch.nn import Sigmoid from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterdataset torchvision.datase…...
PhpStorm安装篇
PhpStorm安装篇: 下载地址 : 进入官网下PhpStorm: PHP IDE and Code Editor from JetBrains 下载完之后,安装包 安装目录建议不要放C盘,放其他盘,其他直接一直点 next ,到结束 安装完,打开编辑器 注册账号并登录后…...
麒麟Linux常见问题
文章目录 麒麟Linux常见问题 1. yum下载不了文件1)报错信息2)原因3)解决(1)更换下载源(2)缓存处理 4)验证 2. 麒麟Linux常见问题 1. yum下载不了文件 1)报错信息 faile…...
一百六十八、Kettle——用海豚调度器定时调度从Kafka到HDFS的任务脚本(持续更新追踪、持续完善)
一、目的 在实际项目中,从Kafka到HDFS的数据是每天自动生成一个文件,按日期区分。而且Kafka在不断生产数据,因此看看kettle是不是需要时刻运行?能不能按照每日自动生成数据文件? 为了测试实际项目中的海豚定时调度从…...
Linux centos7 bash编程(小练习)
一、打印九九乘法口诀 这一个for循环嵌套的小练习,难度不大。提供一种写法,供参考: #!/bin/bash # 文件名:99table.sh # 打印输出九九乘法口诀表 for i in {1..9} do for ((j1;j<$i;j)) do …...
【SpringBoot】Web server failed to start. Port 8080 was already in use.
问题描述 SpringBoot启动Web服务器失败。 *************************** APPLICATION FAILED TO START ***************************Description:Web server failed to start. Port 8080 was already in use.Action:Identify and stop the process thats listening on port 80…...
day-36 代码随想录算法训练营(19)part05
435.无重叠区间 思路:首先对数组排序,只需要关注重叠区间就行,有重叠时计数1,然后更新当前右边界为重叠区间中的最小右边界。 763.划分字母区间 思路:记录每一个字母的最远位置,然后从头开始遍历…...
Vue3 实现JS动态改变CSS样式
以颜色为例子 定义颜色变量 import { reactive } from vue; // 可变的主题颜色 let chooseColor reactive({--color: #be2a27 }) CSS中使用 var() 函数引用颜色变量(这里是用elementPlus为例, 也可以改) :deep(.is-active) {color: var(--color);border-bottom: 2px solid…...
最新社区团购电商小程序源码 无bug完美运营版+详细搭建部署教程
分享一个开源社区团购电商小程序源码,无bug完美运营版,含完整前后端详细搭建部署教程。 系统运营模式:整合线下社区资源,由各快递代收点、社区便利店、社区物业、业主等发起的社区微信群,推送商品信息,消费…...
恒运资本:三大指数震荡走低,地产股大幅回撤,光刻胶概念逆市上涨
周四(8月31日),到上午收盘,A股三大指数震动走低。其间,上证指数跌0.53%,报3120.39点;深证成指和创业板指别离跌0.55%、0.54%;沪深两市算计成交额5290.51亿元,总体来看&am…...
DP读书:不知道干什么就和我一起读书吧——以《鲲鹏处理器 架构与编程》中鲲鹏软件的构成为例
DP读书:不知道干什么就和我一起读书吧 为啥写博客:好处一:记录自己的学习过程优点二:让自己在各大社群里不那么尴尬推荐三:坚持下去,找到一个能支持自己的伙伴模版:鲲鹏软件构成硬件特定软件1. …...
现货黄金走势图中的止盈点
对平仓时机的把握能力,是衡量现货黄金投资者水平的重要标志,止盈点设置得是否合理,在行情兑现的时候能否及时地离场,是事关投资者账户浮盈最终能否落袋为安的“头等大事”,要在现货黄金走势图中把握止盈点,…...
MyBatisPlus实现多租户功能
前言:多租户是一种软件架构技术,在多用户的环境下,共有同一套系统,并且要注意数据之间的隔离性。 一、SaaS多租户简介 1.1、SaaS多租户 SaaS,是Software-as-a-Service的缩写名称,意思为软件即服务&#x…...
JAVA-斐波那契数列
输入一个整数 n ,求斐波那契数列的第 n 项。 假定从 0 开始,第 0 项为 0 。 数据范围 0≤n≤39 样例 输入整数 n5 返回 5class Solution {public int Fibonacci(int n) {int[] dpnew int[250];dp[0]0;dp[1]1;for(int i2;i<n;i){dp[i]dp[i-1]dp[i-2];}…...
keepalived+lvs(DR)
目录 一,作用 二,调度器配置 1,安装keepalived 2, 安装ipvsadm 3, 配置keepalived 4. 查看lvs节点状态 5, web节点配置 1.1 调整ARP参数 1.2 配置虚拟IP地址 1.3添加回环路由 1.4安装nginx并写…...
基于Matlab实现频谱分析(附上源码+数据集)
Matlab是一个功能强大的数值计算和科学计算软件,可以用于频谱分析。频谱分析是一种信号处理技术,用于将时域信号转换为频域信号,以便更好地理解信号的频率特性。本文将介绍使用Matlab实现频谱分析的方法。 文章目录 部分源码完整源码数据集下…...
【Java】多线程(进阶)
多线程进阶 常见的所策略乐观锁和悲观锁重量级锁和轻量级锁自旋锁和挂起等待锁自旋锁挂起等待锁 读写锁和互斥锁读写锁互斥锁 公平锁和非公平锁公平锁非公平锁 可重入锁和不可重入锁可重入锁不可重入锁 CASCAS应用实现原子类实现自旋锁 CAS的ABA问题 synchronized原理基本特点加…...
避开这些坑!在PX4 1.14.0上添加自定义串口传感器的完整避坑指南
PX4 1.14.0自定义串口传感器开发实战:从设备注册到数据解析全链路避坑指南 当你在PX4飞控上尝试接入一款新型激光雷达时,是否遇到过这样的场景:按照官方文档一步步操作,编译通过后却发现传感器始终无法输出有效数据?本…...
Qwen3.5-9B-AWQ-4bit参数调优实战:温度=0.7时中文回答质量与响应速度平衡点
Qwen3.5-9B-AWQ-4bit参数调优实战:温度0.7时中文回答质量与响应速度平衡点 1. 模型概述与参数调优背景 Qwen3.5-9B-AWQ-4bit是一个支持图像理解的多模态模型,能够结合上传图片与文字提示词输出中文分析结果。在实际应用中,我们发现温度参数…...
能做表格的 AI 软件:Excel-Agent,AI 原生重构表格数据分析全流程
当传统 Excel 被卡顿、复杂公式、海量数据难处理、手动重复操作困住时,能做表格的 AI 软件正成为效率破局关键 —— 而 Excel-Agent,正是专为 Excel 场景打造的 AI 数据智能体,以自然语言交互、本地高效计算、全链路数据处理能力,…...
ANIMATEDIFF PRO教学创新:Jupyter Notebook交互式教程
ANIMATEDIFF PRO教学创新:Jupyter Notebook交互式教程 让AI动画学习变得像玩游戏一样有趣,实时调整参数,即刻看到效果变化 1. 引言:为什么需要交互式动画教学? 传统的AI动画教学有个痛点:学生写了一大段代…...
seo白帽优化会不会被搜索引擎识别和惩罚_网站使用seo白帽优化会有什么风险
SEO白帽优化会不会被搜索引擎识别和惩罚 在当今互联网时代,网站的流量和排名直接关系到企业的市场竞争力。作为提升网站排名的重要手段,SEO优化被广泛应用。其中,SEO白帽优化是最为推崇的一种方法。SEO白帽优化会不会被搜索引擎识别和惩罚呢…...
咱们今天聊点硬核但有趣的东西——用纳米级乐高积木(二氧化钛超表面)玩转光漩涡。想象一下,你手上有把能操控光波前形状的万能钥匙,这就是超表面的魅力所在
FDTD模型:基于超表面的完美涡旋光案例。 宽带任意阶 完美涡旋光束 介绍:全介质超表面实现完美矢量涡旋光束生成和完美庞加莱球生成,完美矢量涡旋光束不随拓扑荷的变化而变化,同时满足矢量光场的偏振变化,主要用于光学加密等领域&a…...
[vxe-table] 动态列渲染中v-if与key的协同优化方案
1. 动态列渲染的常见问题与根源分析 在使用vxe-table进行动态列渲染时,很多开发者都遇到过这样的场景:当表格列通过v-if条件动态显示或隐藏时,列的位置和样式会出现莫名其妙的错乱。比如原本应该在第三列显示的数据突然跳到了第五列ÿ…...
《AI Money Hunter:智能财务侦探,你的理财新助手》
《AI Money Hunter:智能财务侦探,你的理财新助手》 【免费下载链接】aimoneyhunter ai副业赚钱大集合,教你如何利用ai做一些副业项目,赚取更多额外收益。The Ultimate Guide to Making Money with AI Side Hustles: Learn how to …...
Flink SQL CDC避坑指南:为什么你的Debezium源表总是漏数据?
Flink SQL CDC数据一致性实战:从Debezium陷阱到高可靠架构设计 在电商大促秒杀和金融交易风控这类对数据一致性要求严苛的场景中,Flink CDC已成为实时数仓建设的核心组件。但当你在凌晨三点收到报警通知,发现订单宽表丢失了关键字段时&#x…...
5步掌握跨平台资源下载神器:从音乐到短视频的完整解决方案
5步掌握跨平台资源下载神器:从音乐到短视频的完整解决方案 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是否…...
