设计模式之模板方法模式
什么是模板方法模式
模板方法模式定义了一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构就可以重定义该算法的某些特定步骤。
模板方法模式主要包含几下几个角色:
AbstractClass(抽象类):在抽象类中定义了一系列基本操作,这些操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在子类中可以重定义或实现这些步骤。同时在抽象类中实现了一个模板方法用于定义一个算法的框架,模板方法不仅可以调用抽象类中实现的方法,也可以调用子类中实现的基本方法。
ConcreteClass(具体类):是抽象类的子类,用于实现父类中声明的抽象方法,也可以覆盖父类中已经实现的具体方法。
模板方法模式的优缺点
优点
- 在父类中定义模板方法,子类实现细节的处理并不会改变模板方法中的执行步骤。
- 提取了公共逻辑放到父类中,提高代码复用性。
- 可在子类中重定义父类中的方法,提高了扩展性。
- 增加新的子类方便,符合单一职责原则和开闭原则。
缺点
- 需要为每一个基本方法的不同实现提供一个子类,如果父类中可变基本方法过多,将会导致类的个数增加。系统更加庞大,设计更加抽象。
模板方法模式的应用场景
- 对一些复杂的算法进行分割,将算法中固定不变的部分设计为模板方法和父类具体方法,一些可变的部分由子类实现。
- 多个类中有公共行为应该被提取出来到父类中减少代码重复。
- 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。
模板方法模式的案例
// 抽象类
public abstract class SoyaMilk {final void make() {select();if (customerWantCondiments()) {addCondiments();}soak();beat();}void select() {System.out.println("第一步:选择好的新鲜黄豆 ");}abstract void addCondiments();void soak() {System.out.println("第三步, 黄豆和配料开始浸泡, 需要3小时 ");}void beat() {System.out.println("第四步:黄豆和配料放到豆浆机去打碎 ");}boolean customerWantCondiments() {return true;}
}// 具体类
public class RedBeanSoyaMilk extends SoyaMilk {@Overridevoid addCondiments() {System.out.println(" 加入上好的红豆 ");}}public class PureSoyaMilk extends SoyaMilk {@Overridevoid addCondiments() {}@Overrideboolean customerWantCondiments() {return false;}}public class PeanutSoyaMilk extends SoyaMilk {@Overridevoid addCondiments() {System.out.println(" 加入上好的花生 ");}}public static void main(String[] args) {//制作红豆豆浆System.out.println("----制作红豆豆浆----");SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();redBeanSoyaMilk.make();System.out.println("----制作花生豆浆----");SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();peanutSoyaMilk.make();System.out.println("----制作纯豆浆----");SoyaMilk pureSoyaMilk = new PureSoyaMilk();pureSoyaMilk.make();
}
模板方法模式在源码中的应用
InputStream
// 抽象类
public abstract class InputStream implements Closeable {public abstract int read() throws IOException;public int read(byte b[]) throws IOException {return read(b, 0, b.length);}......
}// 具体类
public class FileInputStream extends InputStream {public int read() throws IOException {return read0();}public int read(byte b[]) throws IOException {return readBytes(b, 0, b.length);}......
}
相关文章:
设计模式之模板方法模式
什么是模板方法模式 模板方法模式定义了一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构就可以重定义该算法的某些特定步骤。 模板方法模式主要包含几下几个角色: AbstractClass(抽…...
Python数据挖掘基础
一、Matplotlib 画二维图表的python库,实现数据可视化 , 帮助理解数据,方便选择更合适的分析方法1、折线图1.1引入matplotlibimport matplotlib.pyplot as plt %matplotlib inlineplt.figure() plt.plot([1, 0, 9], [4, 5, 6]) plt.show()1.2…...
Go基础-函数
文章目录1 定义2 参数的写法3 返回值的写法4 空白符1 定义 函数是将输入数据通过一系列算法运算之后,输出对应的结果。函数一般都是一些特定的功能块,实现某一种功能的封装,降低代码的冗余性 语法 // 关键字 函数名 函数参数 返…...
AC的改进算法——TRPO、PPO
两类AC的改进算法 整理了动手学强化学习的学习内容 1. TRPO 算法(Trust Region Policy Optimization) 1.1. 前沿 策略梯度算法即沿着梯度方向迭代更新策略参数 。但是这种算法有一个明显的缺点:当策略网络沿着策略梯度更新参数,…...
【C++学习】list的使用及模拟实现
🐱作者:一只大喵咪1201 🐱专栏:《C学习》 🔥格言:你只管努力,剩下的交给时间! list的使用及模拟实现😼构造函数🐵模拟实现😼迭代器🐵…...
动态规划专题精讲1
致前行的人: 要努力,但不要着急,繁花锦簇,硕果累累都需要过程! 前言: 本篇文章为大家带来一种重要的算法题,就是动态规划类型相关的题目,动态规划类的题目在笔试和面试中是考察非常高…...
PPO(proximal policy optimization)算法
博客写到一半发现有篇讲的很清楚,直接化缘了 https://www.jianshu.com/p/9f113adc0c50 Policy gradient 强化学习的目标:学习到一个策略πθ(a∣s)\pi\theta(a|s)πθ(a∣s)来最大化期望回报。 一种直接的方法就是在策略空间中直接搜索来得到最优策略&…...
ElasticSearch基本使用
title: ElasticSearch基本使用 date: 2022-08-29 00:00:00 tags: ElasticSearch基本使用 categories:ElasticSearch 基本概念 随着ES版本的升级,文中有些概念可能已经废弃。 索引词(term) 一个能够被索引的精确值,区分大小写,可以通过term查…...
windows微软商店下载应用失败/下载故障的解决办法;如何在网页上下载微软商店的应用
一、问题背景 设置惠普打印机时,需要安装hp smart,但是官方只提供微软商店这一下载渠道。 点击安装HP Smart,确定进入微软商店下载。 完全加载不出来,可能是因为开了代理。 把代理关了,就能正常打开了。 但是点击“…...
MySQL进阶篇之InnoDB存储引擎
06、InnoDB引擎 6.1、逻辑存储结构 表空间(Tablespace) 表空间在MySQL中最终会生成ibd文件,一个mysql实例可以对应多个表空间,用于存储记录、索引等数据。 段(Segment) 段,分为数据段&#x…...
商标侵权行为的种类有哪些
商标侵权行为的种类有哪些 1、商标侵权行为的种类有以下七种: (1)未经商标注册人的许可,在同一种商品上使用与其注册商标相同的商标的; (2)未经商标注册人的许可,在同一种商品上使用与其注册商标近似的商标,或者在类似商品上使…...
Similarity-Preserving KD(ICCV 2019)原理与代码解析
paper:Similarity-Preserving Knowledge Distillationcode:https://github.com/megvii-research/mdistiller/blob/master/mdistiller/distillers/SP.py背景本文的灵感来源于作者观察到在一个训练好的网络中,语义上相似的输入倾向于引起相似的…...
在Linux和Windows上安装seata-1.6.0
记录:381场景:在CentOS 7.9操作系统上,安装seata-1.6.0。在Windows上操作系统上,安装seata-1.6.0。Seata,一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。版本:JDK…...
兼职任务平台收集(二)分享给有需要的朋友们
互联网时代,给人们带来了很大的便利。信息交流、生活缴费、足不出户购物、便捷出行、线上医疗、线上教育等等很多。可以说,网络的时代会一直存在着。很多人也在互联网上赚到了第一桶金,这跟他们的努力和付出是息息相关的。所谓一份耕耘&#…...
目标检测三大数据格式VOC,YOLO,COCO的详细介绍
注:本文仅供学习,未经同意请勿转载 说明:该博客来源于xiaobai_Ry:2020年3月笔记 对应的PDF下载链接在:待上传 目录 目标检测常见数据集总结 V0C数据集(Annotation的格式是xmI) A. 数据集包含种类: B. V0C2007和V0C2012的区别…...
SpringBoot实现统一返回接口(除AOP)
起因 关于使用AOP去实现统一返回接口在之前的博客中我们已经实现了,但我突然突发奇想,SpringBoot中异常类的统一返回好像是通过RestControllerAdvice 这个注解去完成的,那我是否也可以通过这个注解去实现统一返回接口。 正文 这个方法主要…...
ChatGpt - 基于人工智能检索进行论文写作
摘要 ChatGPT 是一款由 OpenAI 训练的大型语言模型,可用于各种自然语言处理任务,包括论文写作。使用 ChatGPT 可以帮助作者提高论文的语言流畅度、增强表达能力和提高文章质量。在写作过程中,作者可以使用 ChatGPT 生成自然语言的段落、句子、单词或者短语,作为启发式的写…...
实例三:MATLAB APP design-多项式函数拟合
一、APP 界面设计展示 注:在左侧点击数据导入,选择自己的数据表,如果数据导入成功,在右侧的空白框就会显示数据导入成功。在多项式项数右侧框中输入项数,例如2、3、4等,点击计算按钮,右侧坐标框就会显示函数图像,在平均相对误差下面的空白框显示平均相对误差。...
springboot多种方式注入bean获取Bean
springboot动态注入bean1、创建Bean(demo)2、动态注入Bean3、通过注解注入Bean4、通过config配置注入Bean5、通过Import注解导入6、使用FactoryBean接口7、实现BeanDefinitionRegistryPostProcessor接口1、创建Bean(demo) Data public class Demo(){private String name;publi…...
Markdown及其语法详细介绍(全面)
文章目录一、基本语法1.标题2.段落和换行3.强调4.列表5.链接6.图片7.引用8.代码9.分割线10表格二、扩展语法1.标题锚点标题 {#anchor}2.脚注3.自动链接4.任务列表5.删除线6.表情符号7.数学公式三、Markdown 应用1.文档编辑2.博客写作3.代码笔记四、常见的工具和平台支持 Markdo…...
别再瞎调优先级了!STM32CubeMX配置FreeRTOS任务调度器的5个实战避坑点
别再瞎调优先级了!STM32CubeMX配置FreeRTOS任务调度器的5个实战避坑点 刚接触FreeRTOS的嵌入式开发者,往往会在STM32CubeMX的图形化配置界面里迷失方向。那些看似简单的下拉菜单和复选框,背后却藏着让系统崩溃的陷阱。我曾见过一个工程师将任…...
别再死磕公式了!用Python+SymPy从零推导6轴机械臂的DH参数与正逆解(附完整代码)
用PythonSymPy自动化推导6轴机械臂运动学:从DH参数到八组逆解实战 机械臂运动学分析是机器人开发中最烧脑的环节之一。传统手工推导DH参数矩阵不仅容易出错,验证过程更是令人崩溃——想象一下,当你花了两天时间推导出十几页公式,…...
手把手教你用Claude Desktop的MCP协议,5分钟搞定本地SQLite数据库查询
5分钟实现自然语言查询SQLite:Claude Desktop MCP协议实战指南 想象一下这样的场景:你手头有一个存储着上万条商品信息的SQLite数据库,现在需要快速统计某个品类的库存数量。传统方式可能需要打开数据库工具、编写SQL查询语句,或者…...
Marp CLI元数据管理:如何优化SEO和社交媒体分享
Marp CLI元数据管理:如何优化SEO和社交媒体分享 【免费下载链接】marp-cli A CLI interface for Marp and Marpit based converters 项目地址: https://gitcode.com/gh_mirrors/ma/marp-cli Marp CLI是一款强大的命令行工具,让你仅用纯Markdown就…...
Czkawka:智能存储管理的5个核心解决方案
Czkawka:智能存储管理的5个核心解决方案 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka 1.0 现象剖析:数字存储管理的现实困…...
《数据驱动防折叠:利用企微API与数据分析平台构建智能发送决策系统》
一、问题背景企微群发折叠与用户的历史互动行为紧密相关。对长期未交互的用户发送营销内容,折叠概率极高;而对活跃用户发送相似内容,则可能正常显示。因此,单纯从发送端进行策略优化是不够的,必须引入用户维度的数据&a…...
LangChain 1.0 中间件实战:5个钩子函数让你的Agent像专业工程师一样思考
LangChain 1.0中间件深度实践:5个钩子函数打造工程级Agent思维 当我们在2023年首次接触LangChain时,它还是一个以Chain为核心的实验性框架。如今,LangChain 1.0的发布标志着AI Agent开发正式进入生产就绪阶段。本文将带您深入探索其最具革命性…...
RMBG-2.0企业级应用:集成至Shopify后台实现订单图自动去背流水线
RMBG-2.0企业级应用:集成至Shopify后台实现订单图自动去背流水线 想象一下,你是一家Shopify店铺的运营负责人。每天,团队需要处理上百张来自不同供应商的商品图片,手动抠图、换背景,只为让商品主图在网站上看起来统一…...
Gemma-3 Pixel Studio一文详解:Flash Attention 2对图文响应速度提升实测
Gemma-3 Pixel Studio一文详解:Flash Attention 2对图文响应速度提升实测 1. 引言 在当今多模态AI应用快速发展的背景下,Gemma-3 Pixel Studio作为一款基于Google最新开源Gemma-3-12b-it模型构建的高性能对话终端,凭借其卓越的视觉理解能力…...
软考高项“上岸”指南:三位宝藏老师,专治你的备考焦虑
备战软考高项,尤其是面对2026年可能更加灵活的考情,选择一位对的引路人至关重要。今天,就为大家深度介绍软考老金团队的三位王牌导师——尹老师、金老师、秦老师。他们风格互补,却有着共同的目标:陪你稳稳上岸。尹老师…...
