模板方法模式(十六)
相信自己,请一定要相信自己
上一章简单介绍了代理模式(十五), 如果没有看过, 请观看上一章
一. 模板模式
引用 菜鸟教程里面的 模板模式介绍: https://www.runoob.com/design-pattern/template-pattern.html
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。
它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
一.一 介绍
意图: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
主要解决 一些方法通用,却在每一个子类都重新写了这一方法。
何时使用: 有一些通用的方法。
如何解决: 将这些通用算法抽象出来。
关键代码: 在抽象类实现,其他步骤在子类实现。
应用实例: 1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。 2、西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。 3、spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。
优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。
注意事项: 为防止恶意操作,一般模板方法都加上 final 关键词。
二. 模板模式应用
定义一个操作中算法的骨架,而将一些步骤延迟到子类中, 模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。
通俗点讲: 完成一件事情,有固定的数个步骤, 但是每个步骤根据对象的不同,而实现细节不同,
就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤云调用其每个步骤的实现方法。
每个步骤的具体实现,由子类完成。
二.一. 制作牛奶的例子
二.一.一 定义抽象类
@Slf4j
public abstract class Milk {public final void make() {select();if (customerCondiments()) {addCondiments();}soak();beat();}void select() {log.info("第一步,选择好的黄豆");}// 添加信息,由子类去实现protected abstract void addCondiments();void soak() {log.info("第三步, 浸泡 3个小时");}void beat() {log.info("第四步: 打碎");}protected boolean customerCondiments() {return true;}}
二.一.二 不同的实现
无任何添加的
@Slf4j
public class NoMilk extends Milk{@Overrideprotected boolean customerCondiments() {return false;}@Overrideprotected void addCondiments() {}
}
红豆的:
@Slf4j
public class RedDou extends Milk{@Overridepublic void addCondiments() {log.info("第二步,添加红豆");}
}
花生的:
@Slf4j
public class HuaShengMilk extends Milk{@Overridepublic void addCondiments() {log.info("第二步,添加花生");}
}
二.一.三 测试验证
@Testpublic void oneTest() {Milk milk = new HuaShengMilk();milk.make();}@Testpublic void twoTest() {Milk noMilk = new NoMilk();noMilk.make();}
二.二 做饭例子
二.二.一 做饭抽象类
public abstract class Food {public void cookFood() {preparation();make();put();eat();}protected abstract void preparation();protected abstract void make();protected abstract void put();protected abstract void eat();
}
二.二.二 实现子类
做鱼
@Slf4j
public class Fish extends Food{@Overrideprotected void preparation() {log.info(">>> 准备买好的,已经处理过的活,简单再处理");}@Overrideprotected void make() {log.info("烧水,把鱼放进去");}@Overrideprotected void put() {log.info("把鱼放盘子里面,端上来");}@Overrideprotected void eat() {log.info("吃鱼");}
}
下面条:
@Slf4j
public class Noodles extends Food {@Overrideprotected void preparation() {log.info("准备面条,切葱花,烧开水");}@Overrideprotected void make() {log.info("把面条放置滚水里面");}@Overrideprotected void put() {log.info("捞出来,放碗里");}@Overrideprotected void eat() {log.info("开始吃面条");}
}
二.二.三 测试方法
@Testpublic void foodTest() {Food food = new Fish();food.cookFood();food = new Noodles();food.cookFood();}
优点:
- 具体细节步骤实现在子类中,子类定义详细处理算法 是不会改变算法整体结构的。
- 代码复用的基本技术,在数据库设计中特别重要
- 存在一种反向的控制结构, 通过一个低头调用其子类 操作,通过子类对父类进行扩展增加新的行为,
符合开闭原则。
缺点:
每个不同的实现都需要定义一个子类,会导致类的个数增加,系统会变得庞大。
本章节的代码放置在 github 上:
https://github.com/yuejianli/DesignPattern/tree/develop/Template
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!
相关文章:
模板方法模式(十六)
相信自己,请一定要相信自己 上一章简单介绍了代理模式(十五), 如果没有看过, 请观看上一章 一. 模板模式 引用 菜鸟教程里面的 模板模式介绍: https://www.runoob.com/design-pattern/template-pattern.html 在模板模式(Template Pattern)…...
机器学习笔记之优化算法(十九)牛顿法与正则化
机器学习笔记之优化算法——再回首:牛顿法与正则化 引言回顾:经典牛顿法及其弊端牛顿法:算法步骤迭代过程中可能出现的问题正则化 Hessian Matrix \text{Hessian Matrix} Hessian Matrix与相应问题 引言 本节我们介绍经典牛顿法在训练神经网络过程中的迭…...
Java面试之单例模式的六种实现方式
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、为什么要用单例模式二、单例模式的六种实现2.1 饿汉式2.1.1 饿汉式代码实现2.1.2 饿汉式代码实现要点解析2.1.3 饿汉式代码实现优点2.1.4 饿汉式代码实现缺…...
re正则入门
🌸re正则入门 正则表达式 (Regular Expression) 又称 RegEx, 是用来匹配字符的一种工具. 在一大串字符中寻找你需要的内容. 它常被用在很多方面, 比如网页爬虫, 文稿整理, 数据筛选等等 简单的匹配 正则表达式无非就是在做这么一回事. 在文字中找到特定的内容, 比如…...
C++ Day5
目录 一、静态成员 1.1 概念 1.2 格式 1.3 银行账户实例 二、类的继承 2.1 目的 2.2 概念 2.3 格式 2.4 继承方式 2.5 继承中的特殊成员函数 2.5.1 构造函数 2.5.2析构函数 2.5.3 拷贝构造函数 2.5.4拷贝赋值函数 总结: 三、多继承 3.1 概念 3.2 格…...
el-element:自定义参数
希望在下拉框、输入框、多选框中添加自定义参数,这在项目中是非常常见的 1、 Select选择器中remote-method方法带自定义参数 :remote-method"(query)>{remoteMethod(query,自定义参数)}" remoteMethod(query, pid){ } 2、 el多选框方法追加参数&…...
“分布式”与“集群”初学者的技术总结
一、“分布式”与“集群”的解释: 分布式:把一个囊肿的系统分成无数个单独可运行的功能模块 集群: 把相同的项目复制进行多次部署(可以是一台服务器多次部署,例如使用8080部署一个,8081部署一个,…...
C++day5(静态成员、类的继承、多继承)
一、Xmind整理: 二、上课笔记整理: 1.静态数据成员静态成员函数(银行账户实例) #include <iostream>using namespace std;class BankAccount { private:double balance; //余额static double interest_rate; //利率 p…...
2023MySQL+MyBatis知识点整理
文章目录 主键 外键 的区别?什么是范式?什么是反范式?什么是事务?MySQL事务隔离级别?MySQL事务默认提交模式?MySQL中int(1)和int(10)的区别MySQL 浮点数会丢失精度吗?MySQL支持哪几种时间类型&a…...
【随笔】如何使用阿里云的OSS保存基础的服务器环境
使用阿里云OSS创建一个存储仓库:bucket 在Linux上下载并安装阿里云的ossutil工具 // 命令行,是linux环境 3. 安装ossutil。sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash 说明:安装过程中,需要使用解压工具…...
汽车电子笔记之:AUTOSA架构下的多核OS操作系统
目录 1、AUTOSAR多核操作系统 1.1、OS Application 1.2、多核OS的软件分区 1.3、任务调度 1.4、核间任务同步 1.5、计数器、报警器、调度表 1.6、自旋锁与共享资源 1.7、核间通信IOC 1.8、OS Object中元素交互 1.9、多核OS的启动与关闭 2、多核OS注意事项 2.1、最小…...
解决华为云ping不通的问题
进入华为云控制台。依次选择:云服务器->点击服务器id->安全组->更改安全组->添加入方向规则,添加一个安全组规则(ICMP),详见下图 再次ping公网ip就可以ping通了 产生这一问题的原因是ping的协议基于ICMP协…...
数据结构入门 — 链表详解_双向链表
前言 数据结构入门 — 双向链表详解* 博客主页链接:https://blog.csdn.net/m0_74014525 关注博主,后期持续更新系列文章 文章末尾有源码 *****感谢观看,希望对你有所帮助***** 系列文章 第一篇:数据结构入门 — 链表详解_单链表…...
时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测(含KELM、ELM等对比)
时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测(含KELM、ELM等对比) 目录 时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测(含KELM、ELM等对比)预测效果基本介绍模型介绍程序设计参…...
SSL/TLS协议的概念、工作原理、作用以及注意事项
个人主页:insist--个人主页 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、SSL/TLS协议的基本概念 二、SSL/TLS的工作…...
[Stable Diffusion教程] 第一课 原理解析+配置需求+应用安装+基本步骤
第一课 原理解析配置需求应用安装基本步骤 本次内容记录来源于B站的一个视频 以下是自己安装过程中整理的问题及解决方法: 问题:stable-diffusion-webui启动No Python at ‘C:\xxx\xxx\python.exe‘ 解答:打开webui.bat 把 if not de…...
uniapp结合Canvas+renderjs根据经纬度绘制轨迹(二)
uniapp结合Canvasrenderjs根据经纬度绘制轨迹 文章目录 uniapp结合Canvasrenderjs根据经纬度绘制轨迹效果图templaterenderjsjs数据结构 根据官方建议要想在 app-vue 流畅使用 Canvas 动画,需要使用 renderjs 技术,把操作canvas的js逻辑放到视图层运…...
VR全景加盟会遇到哪些问题?全景平台会提供什么?
想创业,你是否也遇到这些问题呢?我是外行怎么办?没有团队怎么办?项目回本周期快吗?项目靠谱吗?加盟平台可信吗?等等这类疑问。近几年,VR产业发展迅速,尤其是VR全景项目在…...
如何进行微服务的集成测试
集成测试的概念 说到集成测试,相信每个测试工程师并不陌生,它不是一个崭新的概念,通过维基百科定义可以知道它在传统软件测试中的含义。 Integration testing (sometimes called integration and testing, abbreviated I&T) is the pha…...
spark grpc 在master运行报错 exitcode13 User did not initialize spark context
程序使用sparksql 以及protobuf grpc ,执行报错 ApplicationMaster: Final app status: FAILED, exitCode: 13, (reason: Uncaught exception: java.lang.IllegalStateException: User did not initialize spark context! 先说原因 : 1.使用了不具备权限…...
nginx 反向代理的原理
Nginx(发音为"engine X")是一个高性能、轻量级的开源Web服务器和反向代理服务器。它的反向代理功能允许将客户端的请求转发到后端服务器,然后将后端服务器的响应返回给客户端。下面是Nginx反向代理的工作原理: 1.客户端…...
【SpringBoot】第二篇:RocketMq使用
背景: 本文会介绍多种案例,教大家如何使用rocketmq。 一般rocketmq使用在微服务项目中,属于分模块使用。这里使用springboot单体项目来模拟使用。 本文以windows系统来做案例。 下载rocketmq和启动: RocketMQ 在 windows 上运行…...
飞天使-vim简单使用技巧
此文是记录技巧使用,如果想节约时间,可以直接看最后一个章节 vim 的介绍 vim号称编辑器之神,唯快不破,可扩展,各种插件满天飞。 vi 1991 vim 1.14 vim四种模式 普通模式: 移动光标, 删除文本,…...
分布式搜索引擎----elasticsearch
目录 1、初识elasticsearch 1.1、什么是elasticsearch 1.2.ELK技术栈 2、正向索引和倒排索引 2.1、正向索引 2.2、倒排索引 2.3、正向索引和倒排索引的区别 3、elasticsearch中的概念理解 3.1、文档和字段 3.2、索引和映射 3.3、mysql与elasticsearch 1、初识elasti…...
AnnotationConfigApplicationContext类和ClasspathXmlApplicationContext类的区别?
在 Spring Framework 中,AnnotationConfigApplicationContext 和 ClasspathXmlApplicationContext 是两个不同的应用程序上下文实现,用于配置和管理 Spring Bean 容器。它们之间的主要区别在于配置的方式和使用场景。 1. **AnnotationConfigApplication…...
使用VSCode SSH实现公网远程连接本地服务器开发的详细教程
文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…...
Codeforces Round 894 (Div. 3)
还是打一下卡!!! (A,B,C) 目录 A. Gift Carpet 链接 : 题面 : 题目意思 : 思路 : 代码 : B. Sequence Game 链接 : 题面 : 编辑 题目意思 : 思路 : 代码 : C. Flower City Fence 原题链接 : 题面 : 题目意思 : 思路 : 代码 : A. Gift Carpet 链…...
ACL2023 Prompt 相关文章速通 Part 1
Accepted Papers link: ACL2023 main conference accepted papers 文章目录 Accepted PapersPrompter: Zero-shot Adaptive Prefixes for Dialogue State Tracking Domain AdaptationQuery Refinement Prompts for Closed-Book Long-Form QAPrompting Language Models for Lin…...
“R语言+遥感“水环境综合评价方法
详情点击链接:"R语言遥感"水环境综合评价方法 一:R语言 1.1 R语言特点(R语言) 1.2 安装R(R语言) 1.3 安装RStudio(R语言) (1)下载地址 &…...
数据结构之哈希
哈希 1. 哈希概念2. 哈希冲突3. 哈希冲突解决3.1 哈希表的闭散列3.2 哈希表的开散列 2. 哈希的应用2.1 位图2.2 布隆过滤器 哈希(Hash)是一种将任意长度的二进制明文映射为较短的二进制串的算法。它是一种重要的存储方式,也是一种常见的检索方…...
长沙市公司/网站关键词优化方案
一、什么是sphinx原理:sphinx将数据库中的表建立索引,php操作sphinx时,将要查询的关键字进行匹配,返回一个id,php通过id到数据库中查询数据。二、下载重要文件说明:三、使用sphinx1、复制csft_mysql.conf文…...
网站建设与管理是什么/百度下载app下载
客户 房屋租赁管理局 故障现象:SQL2005 分组数据库 主数据库2GB 10个分组NDF 数据库 每个3GB,数据库报置疑,脱机。客户说在赛格找其他恢复商 修复该分组数据库 耗费了3天时间,最终修复无望。后在 同行的介绍下联系上我们,了解故…...
沈阳网站公司排名/灰色行业推广平台网站
修改CKplayer.js 源码解决移动端浏览器全屏不能限制快进的问题参考文章: (1)修改CKplayer.js 源码解决移动端浏览器全屏不能限制快进的问题 (2)https://www.cnblogs.com/jying/p/9642445.html 备忘一下。...
网站底部工信部链接怎么做/营销软件哪个好
大家都知道iPhone的续航能力十分的让人不敢恭维,电池容量总是比别人少一点。所以平常使用的时候更要好好的爱护她,让它的寿命可以更长一点。通常一个电池的寿命是在1.5-2年之间,苹果手机电池健康值低于80%就是需要换电池的时候了。当然总有大…...
网站制作青岛/营销推广的方法有哪些
效果图 归位(back) 表达式代码与注释 var s 1.70158; ///< 用于 "归位" 的超越量/// note 归位函数 function outBack(t, b, c, d) {if (s null)s 1.70158;return c * ((t t / d - 1) * t * ((s 1) * t s) 1) b; }/// note 实际调…...
wordpress博客添加到菜单/小红书新媒体营销案例分析
本题比较困难的地方对于我来说应该是输入,后来参考了别人的代码原来还有stringstream这么好用的东西 还有就是方向的处理上面,lrj的方法比较巧妙,他是把方向全部转化成0-3然后一一对应数组中的元素 #include<iostream>//不需要判断边…...