当前位置: 首页 > news >正文

设计模式之-模板方法模式,通俗易懂快速理解,以及模板方法模式的使用场景

系列文章目录

设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列
设计模式之-单列设计模式,5种单例设计模式使用场景以及它们的优缺点
设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式,每一种模式的概念、使用场景和优缺点。
设计模式之模板方法模式,通俗易懂快速理解,以及模板方法模式的使用场景
设计模式之-建造者模式通俗易懂理解,以及建造者模式的使用场景和示列代码
设计模式之-代理模式,快速掌握理解代理模式,以及代理模式的使用场景
设计模式之-原型模式,快速掌握原型模式,通俗易懂的理解原型模式以及使用场景
设计模式之-中介者模式,快速掌握中介者模式,通俗易懂的讲解中介者模式以及它的使用场景
设计模式之-责任链模式,快速掌握责任链模式,通俗易懂的讲解责任链模式以及它的使用场景
设计模式之-装饰模式,快速掌握装饰模式,通俗易懂的讲解装饰模式以及它的使用场景


文章目录

  • 系列文章目录
  • 前言
  • 一、使用场景通常
  • 二、通过一个故事来更好地理解它
    • 当谈到模板方法模式时,我们可以通过一个故事来更好地理解它。
    • 以下是对应于故事的代码示例:


前言

当谈到模板方法模式时,在面向对象的编程中,它是一种行为设计模式。模板方法模式定义了一个操作中的算法骨架,将一些步骤延迟到子类中实现,使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。
使用模板方法模式的主要目的是将通用的算法步骤抽象到父类中,然后通过具体的子类来实现这些步骤的具体细节。这样可以避免代码的重复,并且使得算法的结构更加清晰可见。

一、使用场景通常

模板方法模式的使用场景通常是在以下情况下:

当有一个通用的算法结构,但其中的某些步骤的具体实现可能会有所不同时,可以使用模板方法模式。例如,一个建筑公司可能有多个具体的建筑项目,但它们共享相同的施工过程。
当需要在不改变算法结构的情况下,通过子类来扩展或修改某些步骤的实现时,可以使用模板方法模式。

二、通过一个故事来更好地理解它

当谈到模板方法模式时,我们可以通过一个故事来更好地理解它。

假设有一个叫做Tom的人,他是一名音乐家,他每天都有一套固定的音乐表演流程。这个流程包括三个步骤:准备乐器、演奏音乐、道别观众。

Tom为了能够更好地组织自己的表演,决定使用模板方法模式。他创建了一个名为Musician的抽象类,其中定义了一个名为performance的模板方法。

开始:

Tom首先准备乐器,这是表演的第一步。在抽象类Musician中,他定义了一个名为prepareInstrument的抽象方法,他知道这是一个必须由不同的音乐家来具体实现的步骤。

然后:

Tom开始演奏音乐,这是表演的第二步。在抽象类Musician中,他定义了一个名为playMusic的具体方法,这个方法有一个默认的实现,其中包含了一些通用的演奏操作。

最后:

Tom道别观众,这是表演的最后一步。在抽象类Musician中,他定义了一个名为farewellAudience的抽象方法,他知道每个音乐家都有不同的方式来与观众道别。

Tom创建了两个具体的子类:Pianist和Violinist,他们都继承了Musician类。在这两个子类中,他们分别实现了抽象方法prepareInstrument和farewellAudience。

当Tom要进行表演时,他选择具体的子类来实例化,并调用performance方法。这个方法按照抽象类中定义的顺序依次调用了prepareInstrument、playMusic和farewellAudience方法。

通过模板方法模式,Tom可以轻松地组织自己的音乐表演流程,而不必关心每个具体步骤的细节。他可以根据需要选择不同的子类来实现特定的步骤,从而实现了代码的复用和灵活性的提高。

以下是对应于故事的代码示例:

// 抽象类
abstract class Musician {// 模板方法public final void performance() {prepareInstrument();playMusic();farewellAudience();}// 抽象方法,子类必须实现protected abstract void prepareInstrument();// 具体方法,子类可以选择性实现protected void playMusic() {System.out.println("Playing music");}// 抽象方法,子类必须实现protected abstract void farewellAudience();
}// 具体类:钢琴家
class Pianist extends Musician {@Overrideprotected void prepareInstrument() {System.out.println("Preparing piano");}@Overrideprotected void farewellAudience() {System.out.println("Farewell, audience");}
}// 具体类:小提琴家
class Violinist extends Musician {@Overrideprotected void prepareInstrument() {System.out.println("Preparing violin");}@Overrideprotected void farewellAudience() {System.out.println("Farewell, audience");}
}// 客户端代码
public class Main {public static void main(String[] args) {Musician pianist = new Pianist();pianist.performance();Musician violinist = new Violinist();violinist.performance();}
}

在上面的示例中,Musician是一个抽象类,其中定义了一个模板方法performance,这个方法包含了一系列的表演步骤调用。其中,prepareInstrument和farewellAudience是抽象方法,需要在具体的子类中实现;而playMusic是一个具体方法,可以选择性地在子类中实现。

Pianist和Violinist是具体的子类,它们继承了Musician并实现了其中的抽象方法。通过调用performance方法,可以看到具体子类中的实现细节按照抽象类中定义的算法骨架被执行。

这样,通过模板方法模式,Tom可以按照固定的流程进行音乐表演,而不必关心每个具体步骤的细节。他可以根据需要选择不同的子类来实现特定的步骤,从而实现了代码的复用和灵活性的提高。

相关文章:

设计模式之-模板方法模式,通俗易懂快速理解,以及模板方法模式的使用场景

系列文章目录 设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列 设计模式之-单列设计模式,5种单例设计模式使用场景以及它们的优缺点 设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式,每一种模式的概念、使用…...

微软官方出品:GPT大模型编排工具,支持C#、Python等多个语言版本

随着ChatGPT的火热,基于大模型开发应用已经成为新的风口。虽然目前的大型模型已经具备相当高的智能水平,但它们仍然无法完全实现业务流程的自动化,从而达到用户的目标。 微软官方开源的Semantic Kernel的AI编排工具,就可以很好的…...

docker安装的php 在cli中使用

1: 修改 ~/.bashrc 中新增 php7 () {ttytty -s && tty--ttydocker run \$tty \--interactive \--rm \--volume /website:/website:rw \--workdir /website/project \--networkdnmp_dnmp \dnmp_php php "$" }–networkdnmp_dnmp 重要, 不然连不上数据库, 可通…...

tcp vegas 为什么好

我吹捧 bbr 时曾论证过它在和 buffer 拧巴的时候表现如何优秀,但这一次说 vegas 时,我说的是从拥塞控制这个问题本身看来,vegas 为什么好,并且正确。 接着昨天 tcp vegas 鉴赏 继续扯。 假设一群共享带宽的流量中有流量退出或有…...

【设计模式】命令模式

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、什么是命令模式? 二、命令模式的优点和应用场景 三、命令模式的要素和实现 3.1 命令 3.2 具体命令 3.3 接受者 …...

Unity头发飘动效果

Unity头发飘动 介绍动作做头发飘动头发骨骼绑定模拟物理组件 UnityChan插件下载UnityChan具体用法确定人物是否绑定好骨骼节点(要做的部位比如头发等)给人物添加SpringManager骨骼管理器给骨骼节点添加SpringBone这里给每个头发骨骼都添加上SpringBone。…...

【MIKE】MIKE河网编辑器操作说明

目录 MIKE河网编辑器说明河网定义河网编辑工具栏河网文件(.nwk11)输入步骤1. 从传统的地图引入底图1.1 底图准备1.2 引入河网底图1.3 输入各河段信息2. 从ARCView .shp文件引入底图MIKE河网编辑器说明 河网编辑器主要功能有两个: ①河网的编辑和参数输人,包括数字化河网及…...

RIPV1配置实验

查看路由器路由表: 删除手工配置的静态路由项: Route1->Config->static Remove删除路由项 删除Route3的路由项,方法同上删除Route2的路由项,方法同上 完成路由器RIP配置: Route1->Config->RIP->Ne…...

快速实现农业机械设备远程监控

农业机械设备远程监控解决方案 一、项目背景 近年来,农业生产事故时有发生,农业安全问题已经成为农业生产中的关键问题,农业监控系统在农业安全生产中发挥着重要作用。农业机械设备以计划维修或定期保养为主,在日常应用的过程中因…...

解决用Fiddler抓包,网页显示你的连接不是专用/私密连接

关键:重置fiddler的证书 在Fiddler重置证书 1、Actions --> Reset All Certificates --> 弹窗一路yes 2、关掉Fiddler,重新打开 3、手机删掉证书,重新下载安装。 (如果还不行,重新试一遍,先把浏览器…...

单片机原理及应用:流水灯的点亮

流水灯是一种简单的单片机控制电路&#xff0c;由许多LED组成&#xff0c;电路工作时LED会按顺序点亮&#xff0c;类似于流水的效果。 下面是运行在keil上的代码&#xff0c;分别使用了数组&#xff0c;移位符和库函数来表示。 //数组法 #include <reg52.h> //头文…...

蓝桥杯宝藏排序算法(冒泡、选择、插入)

冒泡排序: def bubble_sort(li): # 函数方式for i in range(len(li)-1):exchangeFalsefor j in range(len(li)-i-1):if li[j]>li[j1]:li[j],li[j1]li[j1],li[j]exchangeTrueif not exchange:return 选择排序: 从左往右找到最小的元素&#xff0c;放在起始位置…...

使用@jiaminghi/data-view实现一个数据大屏

<template><div class"content bg"><!-- 全局容器 --><!-- <dv-full-screen-container> --><!-- 第二行 --><div class"module-box" style"align-items: start; margin-top: 10px"><!-- 左 -->…...

神经网络:池化层知识点

1.CNN中池化的作用 池化层的作用是对感受野内的特征进行选择&#xff0c;提取区域内最具代表性的特征&#xff0c;能够有效地减少输出特征数量&#xff0c;进而减少模型参数量。按操作类型通常分为最大池化(Max Pooling)、平均池化(Average Pooling)和求和池化(Sum Pooling)&a…...

微服务常见的配置中心简介

微服务架构中&#xff0c;常见的配置中心包括以下几种&#xff1a; Spring Cloud Config&#xff1a; Spring Cloud Config是官方推荐的配置中心解决方案&#xff0c;它支持将配置文件存储在Git、SVN等版本控制系统中。通过提供RESTful API&#xff0c;各个微服务可以远程获取和…...

银河麒麟v10 rpm安装包 安装mysql 8.35

银河麒麟v10 rpm安装包 安装mysql 8.35 1、卸载mariadb2、下载Mysql安装包3、安装Mysql 8.353.1、安装Mysql 8.353.3、安装后配置 1、卸载mariadb 由于银河麒麟v10系统默认安装了mariadb 会与Mysql相冲突&#xff0c;因此首先需要卸载系统自带的mariadb 查看系统上默认安装的M…...

一篇文章带你搞定CTFMice基本操作

CTF比赛是在最短时间内拿到最多的flag&#xff0c;mice必须要有人做&#xff0c;或者一支战队必须留出一块时间专门写一些mice&#xff0c;web&#xff0c;pwn最后的一两道基本都会有难度&#xff0c;这时候就看mice的解题速度了&#xff01; 说实话&#xff0c;这是很大一块&…...

Spring security之授权

前言 本篇为大家带来Spring security的授权&#xff0c;首先要理解一些概念&#xff0c;有关于&#xff1a;权限、角色、安全上下文、访问控制表达式、方法级安全性、访问决策管理器 一.授权的基本介绍 Spring Security 中的授权分为两种类型&#xff1a; 基于角色的授权&…...

模式识别与机器学习(十一):Bagging

1.原理 Bagging [Breiman, 1996a] 是井行式集成学习方法最著名的代表.从名字即可看出&#xff0c;它直接基于自助采样法(bootstrap sampling)。给定包含m 个样本的数据集&#xff0c;我们先随机取出一个样本放入采样集中&#xff0c;再把该样本放回初始数据集&#xff0c;使得…...

数据压缩(哈夫曼编码)

【问题描述】在数据压缩问题中&#xff0c;需要将数据文件转换成由二进制字符0、1组成的二进制串&#xff0c;称之为编码&#xff0c;已知待压缩的数据中包含若干字母&#xff08;A-Z&#xff09;&#xff0c;为获得更好的空间效率&#xff0c;请设计有效的用于数据压缩的二进制…...

移动安全APP--Frida+模拟器,模拟器+burp联动

最近测APP被通报了&#xff0c;问题点测得比较深&#xff0c;涉及到frida和burp抓包&#xff0c;一般在公司可能会有网络的限制&#xff0c;手机没办法抓包&#xff0c;我就直接在模拟器上试了&#xff0c;就在这记录一下安装过程。 目录 一、Frida安装 二、burp与逍遥模拟器…...

MATLAB遗传算法工具箱的三种使用方法

MATLAB中有三种调用遗传算法的方式&#xff1a; 一、遗传算法的开源文件 下载“gatbx”压缩包文件&#xff0c;解压后&#xff0c;里面有多个.m文件&#xff0c;可以看到这些文件的编辑日期都是1998年&#xff0c;很古老了。 这些文件包含了遗传算法的基础操作&#xff0c;包含…...

复习linux——时间同步服务

加密和安全当前都离不开时间的同步&#xff0c;否则各种网络服务可能不能正常运行 时间错误可能导致证书应用出错 时间同步服务 多主机协作工作时,各个主机的时间同步很重要&#xff0c;时间不一致会造成很多重要应用故障&#xff0c;利用NTP协议使网络中的各个计算机时间达到…...

如何在Linux设置JumpServer实现无公网ip远程访问管理界面

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…...

【Git】在 IDEA 中合并多个 commit 为一个

文章目录 1 未提交到远程分支1.1 需求说明1.2 reset 操作1.3 再次 push 2 已经提交到远程分支2.1 需求说明2.2 rebase 操作2.3 强制 push 分两种情况&#xff1a; 一种是本地提交还没推到远程&#xff0c;这种好处理另一种是已经提交到远程分支&#xff0c;这个略麻烦 1 未提…...

性能实战(一) --- clock_gettime造成系统整体cpu过高定位过程

问题背景 有一台linux服务器测试环境cpu经常到达80%,造成系统卡顿,部分功能不可用. 分析步骤 1.使用perf制作cpu火焰图 通过制作cpu火焰图,发现很多进程都存在大量的clock_gettime系统调用. 2. 使用bcc工具funclatency`进一步查看clock_gettime的调用次数 # /usr/share/bc…...

Ai 会替代人类工作吗?

目录 一、分析 二、一些案例 三、总结 一、分析 人工智能&#xff08;AI&#xff09;的发展和应用正在改变我们的生活和工作方式。在某些领域&#xff0c;AI已经显示出了强大的能力和潜力&#xff0c;可以比人类更快、更准确地完成任务。然而&#xff0c;是否会完全取代人类…...

神经网络:深度学习基础

1.反向传播算法&#xff08;BP&#xff09;的概念及简单推导 反向传播&#xff08;Backpropagation&#xff0c;BP&#xff09;算法是一种与最优化方法&#xff08;如梯度下降法&#xff09;结合使用的&#xff0c;用来训练人工神经网络的常见算法。BP算法对网络中所有权重计算…...

如何在Windows上搭建WebDAV服务并通过内网穿透实现公网访问

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav&#xff0c;并且结合cpolar的内网穿透工具实现在公网访…...

【Transformer框架代码实现】

Transformer Transformer框架注意力机制框架导入必要的库Input Embedding / Out EmbeddingPositional EmbeddingTransformer EmbeddingScaleDotProductAttention(self-attention)MultiHeadAttention 多头注意力机制EncoderLayer 编码层Encoder多层编码块&#xff0f;前馈网络层…...

装修材料/seo公司推荐

举个例子吧 现在的静态网页&#xff0c;有很多都会插入百度地图&#xff0c;特别是商家&#xff0c;或是企业站 例如 点击查看百度地图 便会进入这个网页中 也可以直接嵌入网页中&#xff0c;把地图的html代码&#xff0c;放入一个div中 下面步入正题&#xff0c;看看怎么来获取…...

wordpress 多菜单/个人网站制作教程

SQL2008 R2 如何使用SQL数据库的.bak备份文件恢复还原数据库&#xff0c;具体步骤如下&#xff1a;1、【开始】菜单 - 选择【Microsoft SQL Server 2008 R2】 - 【SQL Server Management Studio】&#xff0c;如下图&#xff1a;2、选择或输入【服务器名称】- 选择身份验证方式…...

泰州哪家做网站建设比较好/网络营销策划书

问题来源: http://www.cnblogs.com/del/archive/2009/06/05/1496857.html#1549294TTrayIcon 的主要属性:TrayIcon.Icon指定托盘图标, 有几种用法:1、设计时选择;2、把一个 TIcon 对象给它;3、使用当前程序图标: TrayIcon1.Icon : Application.Icon;4、TrayIcon1.SetDefaultIcon…...

做网站设计服务商/6个好用的bt种子搜索引擎

...

有名的网站开发工具/网站优化公司哪个好

QML Modules 在Qt 6.2中&#xff0c;首次出现了一个全面的构建系统API&#xff0c;允许您将QML模块指定为一个完整的、封装的单元。这是一个显著的改进&#xff0c;但由于QML模块的概念在Qt 5中还很不成熟&#xff0c;甚至经验丰富的QML开发人员现在可能会问“QML模块到底是什…...

ps怎么做网站页面/百度官网网站

阅读本文大概需要 2.8 分钟。来自&#xff1a;https://blog.csdn.net/xiaojimanman/article/details/18556703前几天&#xff0c;在其他网站上看到一个表情自动生成器&#xff0c;自己就试着做了一下&#xff0c;没想到还真给搞定了&#xff5e;目前&#xff0c;可以处理“臣妾…...