当前位置: 首页 > 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;请设计有效的用于数据压缩的二进制…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...