二十三种设计模式全面解析-深入解析模板方法模式的奇妙世界
在软件设计的奇妙宇宙中,有一种设计模式如一颗流星般划过,留下绚丽的光芒,它就是——模板方法模式(Template Method Pattern)。这个模式不仅令代码更加灵活,而且蕴含了一种设计哲学,本文将深入研究模板方法模式,揭示其神秘的面纱,带你踏入设计模式的神秘大门。
1. 模板方法模式简介
模板方法模式是一种行为型设计模式,其核心思想在于定义一个算法的框架,将一些步骤的实现延迟到子类。这样,子类可以在不改变算法结构的情况下重新定义某些步骤的具体实现。
2. 模板方法模式的核心结构
在模板方法模式中,有两个主要角色:
- 抽象类(Abstract Class): 定义算法框架,其中包含了一个或多个抽象方法,这些方法由子类负责实现。同时,抽象类中可能包含一些具体方法,它们构成了算法的骨架。
- 具体子类(Concrete Class): 实现抽象类中定义的抽象方法,完成算法的具体步骤。同时,具体子类也可以覆盖抽象类中的某些具体方法,以满足特定需求。
3. 模板方法模式的适用场景
模板方法模式常常应用于以下场景:
- 算法的骨架不可改变: 当一个算法的基本结构已经确定,但其中的一些步骤的具体实现可能各不相同时,可以使用模板方法模式。
- 代码复用: 当多个类有相似的算法框架,但某些步骤的具体实现不同时,可以将这些相似的部分抽取到一个抽象类中,实现代码的复用。
- 扩展性: 模板方法模式允许子类根据需要扩展或重写算法的部分步骤,从而实现灵活的扩展。
4. 深入代码:模板方法模式实例
为了更好地理解模板方法模式,让我们通过一个简单的实例来深入研究。假设我们有一个制作饮料的模板,其中包括了煮水、冲泡、倒入杯中等步骤。我们将创建一个抽象类 BeverageTemplate 来定义这个制作饮料的模板。
// 抽象类
abstract class BeverageTemplate {// 制作饮料的模板方法final void makeBeverage() {boilWater();brew();pourInCup();if (customerWantsCondiments()) {addCondiments();}}// 具体步骤的抽象方法,由子类实现abstract void brew();abstract void addCondiments();// 具体方法,已经实现的步骤void boilWater() {System.out.println("煮沸水");}void pourInCup() {System.out.println("倒入杯中");}// 钩子方法,用于控制某些步骤的执行boolean customerWantsCondiments() {return true;}
}// 具体子类
class Coffee extends BeverageTemplate {@Overridevoid brew() {System.out.println("冲泡咖啡");}@Overridevoid addCondiments() {System.out.println("加入牛奶和糖");}
}class Tea extends BeverageTemplate {@Overridevoid brew() {System.out.println("冲泡茶叶");}@Overridevoid addCondiments() {System.out.println("加入柠檬");}// 重写钩子方法,控制是否加入调味品@Overrideboolean customerWantsCondiments() {return false;}
}
通过这个例子,我们可以看到 BeverageTemplate 定义了整个制作饮料的模板,而具体的步骤则由子类实现。这种模板方法模式使得制作不同类型的饮料变得简单而灵活。
然而,设计模式世界中还有许多其他精彩的故事等待我们探索。在下一篇博文中,我们将深入研究另一个引人入胜的设计模式,为你带来更多惊喜。敬请期待!
好了,今天的分享到此结束。如果觉得我的博文帮到了您,您的点赞和关注是对我最大的支持。如遇到什么问题,可评论区留言。
相关文章:
二十三种设计模式全面解析-深入解析模板方法模式的奇妙世界
在软件设计的奇妙宇宙中,有一种设计模式如一颗流星般划过,留下绚丽的光芒,它就是——模板方法模式(Template Method Pattern)。这个模式不仅令代码更加灵活,而且蕴含了一种设计哲学,本文将深入研…...
【Spring】加载properties文件
文章目录 在Spring Context中加载properties文件测试总结 在Spring Context中加载properties文件 分为三步,如下图所示: 完整代码: <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.…...
react中间件的理解
一、是什么? 中间件(Middleware)在计算机中,是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络应用上的各个部分或不同的应用,能…...
React函数组件状态Hook—useState《进阶-对象数组》
React函数组件状态-state 对象 state state 中可以保存任意类型的 JavaScript 值,包括对象。但是,你不应该直接修改存放在 React state 中的对象。相反,当你想要更新⼀个对象时,你需要创建⼀个新的对象(或者将其拷⻉⼀…...
linux 网络 cat /proc/net/dev 查看测试网络丢包情况
可以通过 cat /proc/net/dev 查看测试网络丢包情况,drop关键字,查看所有网卡的丢包情况 还可以看其他数据, /proc/net/下面有如下文件...
记录配置VS,使用opencv与Eigen
方法一: 1.下载VS 2.配置opencv,参考大佬博客,注意更改博客中版本的部分细节,比如opencv_world440d.lib换成自己下载的版本 3.配置Eigen,参考大佬博客 方法二:博客 本人第一次配置时候按照这篇内容配置的,但是不知道哪…...
uart控制led与beep
仲裁模块代码: // 外设控制模块,根据uart接收到的数据,控制led与beep的标志信号。 module arbit(input wire sys_clk ,input wire sys_rst_n ,input wire pi_flag …...
Linux修改root密码
如果知道当前的root密码,修改boot密码操作较简单。 步骤如下: # passwd --在root用户下执行passwd命令 Changing password for user root. New password: --此处输入新密码 BAD PASSWORD: The password is shorter than 8 characters Ret…...
C/C++模板类模板与函数模板区别,以及用法详解
类模板 类模板语法 类模板作用: 建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表。 语法: template<typename T> 类解释: template --- 声明创建模板 typename --- 表面其后面的…...
van-dialog弹窗异步关闭-校验表单
van-dialog弹窗异步关闭 有时候我们需要通过弹窗去处理表单数据,在原生微信小程序配合vant组件中有多种方式实现,其中UI美观度最高的就是通过van-dialog嵌套表单实现。 通常表单涉及到是否必填,在van-dialog的确认事件中直接return是无法阻止…...
Dynamic Wallpaper 16.7中文版
Macos动态壁纸推荐: Dynamic Wallpaper是一款Mac平台上的动态壁纸应用程序,它可以根据时间等因素动态切换壁纸,提供更加生动和多样化的桌面体验。 Dynamic Wallpaper包含了多个动态壁纸,用户可以根据自己的喜好选择和切换。这些…...
如何使用ArcGIS Pro制作渐变河流效果
对于面要素的河流水系,制作渐变效果方法比较简单,如果是线要素的河流有办法制作渐变效果吗,答案是肯定的,这里为大家介绍一下制作方法,希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的水系数…...
《网络协议》06. HTTP 补充 · HTTPS · SSL/TLS
title: 《网络协议》06. HTTP 补充 HTTPS SSL/TLS date: 2022-10-06 18:09:55 updated: 2023-11-15 07:53:52 categories: 学习记录:网络协议 excerpt: HTTP/1.1 协议的不足、HTTP/2、HTTP/3、HTTP 协议的安全问题、SPDY、HTTPS、SSL/TLS、OpenSSL。 comments: fa…...
Python winreg将cmd/PowerShell(管理员)添加到右键菜单
效果 1. 脚本 用管理员权限运行,重复执行会起到覆盖效果(根据sub_key)。 icon自己设置。text可以自定义。sub_key可以改但不推荐(避免改成和系统已有项冲突的)。command不要改。 from winreg import *registry r&q…...
redis运维(九)字符串(二)字符串过期时间
一 字符串过期时间 细节点: 注意命令的入参和返回值 ① 再谈过期时间 说明: 设置key的同时并且设置过期时间,是一个原子操作 ② ttl 检查过期时间 ③ persist 删除过期时间 ④ redis 删除过期key的机制 ⑤ 惰性删除 惰性理解:让过期…...
【C++】多线程的学习笔记(3)——白话文版(bushi
前言 好久没有继续写博客了,原因就是去沉淀了一下偷懒了一下 现在在学网络编程,c的多线程也还在学 这一变博客就讲讲c中的Condition Variable库吧 Condition Variable的简介 官方原文解释 翻译就是 条件变量是一个对象,它能够阻止调用…...
kotlin--3.集合操作
目录 一.list集合 二.Set集合 三.Map集合 迭代遍历Map集合: 8.hashMap 四.Stream流 1.map 2.filter 3.reduce 4.forEach 5.sorted 6.distinct 7.综合案例 一.list集合 在Kotlin中,常见的List集合类型有以下几种: listOf&…...
自动驾驶-BEV感知综述
BEV感知综述 随着自动驾驶传感器配置多模态化、多源化,将多源信息在unified View下表达变得更加关键。BEV视角下构建的local map对于多源信息融合及理解更加直观简洁,同时对于后续规划控制模块任务的开展也更为方便。BEV感知的核心问题是: …...
面试题-3
1.说一下原型链 原型就是一个普通对象,它是为构造函数实例共享属性和方法,所有实例中引用原型都是同一个对象 使用prototype可以把方法挂载在原型上,内存值保存一致 _proto_可以理解为指针,实例对象中的属性,指向了构造函数的原型(prototype) 2.new操…...
C++ Core Guidelines 中文版 GSL
C GSL(Guideline Support Library)是由 Microsoft 开发的一个开源库,旨在提供一组通用的 C 标准库扩展,以支持 C 标准委员会提出的指导原则。GSL 为 C 开发人员提供了许多有用的工具和类型,以帮助他们编写更安全、更高…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...
FOPLP vs CoWoS
以下是 FOPLP(Fan-out panel-level packaging 扇出型面板级封装)与 CoWoS(Chip on Wafer on Substrate)两种先进封装技术的详细对比分析,涵盖技术原理、性能、成本、应用场景及市场趋势等维度: 一、技术原…...
