设计模式-行为型模式-模板方法模式

一、什么是模板模式

        模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法骨架,允许子类在不改变算法整体结构的情况下重新定义算法的某些步骤。

        主要组成部分:

        1、模板方法(Template Method): 定义了算法的骨架结构,包含了一个算法的整体流程,并将某些步骤的实现推迟到子类中。通常作为一个抽象方法或者具有默认实现的方法。

        2、具体方法(Concrete Methods): 模板方法中的步骤可能有一些默认实现,在模板方法中直接实现的步骤。

        3、抽象方法(Abstract Methods): 在模板方法中留给子类实现的方法,用于子类实现具体步骤。

        工作原理:

        模板方法模式定义了一个固定算法的框架,其中一些步骤是固定的,而另一些可以由子类实现。抽象类中的模板方法规定了算法的结构和执行顺序,而具体的步骤则由子类实现。

二、场景模拟

        这里拿2023年海康威视秋招的一个问答题为例。题目是这么描述的:实现两个巡检任务,其中A巡检任务使用现场扫描二维码的方式巡检机房的服务器状态(正常/异常),B巡检任务使用远程视频方式巡检服务器正常运行率(百分比数字),两个巡检任务结束后都要提交巡检结果。使用模板方法设计模式解决。

        我们简单的将A和B任务的流程画出了,很简单,就是A使用二维码方式巡检,返回正常/异常的结果;B使用远程视频方式巡检,返回百分率。这里,我们发现,他们有着共同的流程,先巡检,再上报,可能有些方法的具体实现不一样,但是整体流程是确定的。

三、业务实现

        其中抽象类Inspect定义了巡检的流程,然后提供了默认的实现方法 。两个不同的巡检方法继承Inspect,可以根据需求自定义方法,也可以使用Inspect提供的默认实现方法。

3.1、使用模板类定义一个巡检框架

@Slf4j
public abstract class Inspect<T> {// 巡检名称private final String inspectName;public Inspect(String inspectName) {this.inspectName = inspectName;}public T startInspect(){initInspect();inspectFunction();return submitInspect();}/*** 初始化巡检方法*/protected void initInspect(){log.info("初始化巡查系统" + inspectName);}// 模拟不同的巡检方式protected abstract void inspectFunction();// 返回巡检信息protected abstract T submitInspect();
}

可以看到上方定义了三个流程,首先初始化,然后模拟不同的巡检方式,最后返回巡检信息。流程是固定的,只不过不同的巡检可能使用不同的方式,所以需要写单独的类去实现。

3.2、子类继承模板抽象类后自定义

例如巡检A,使用的是二维码的形式巡检,并返回(正常/异常)状态,我们用布尔值模拟。

@Slf4j
public class AInspect extends Inspect<Boolean> {public AInspect(String inspectName) {super(inspectName);}@Overrideprotected void inspectFunction() {log.info("使用二维码方式巡检……");}@Overrideprotected Boolean submitInspect() {return true;}
}

巡检B,使用的是远程视频监控的形式,并返回百分比比例,我们用double模拟;

@Slf4j
public class BInspect extends Inspect<Double> {public BInspect(String inspectName) {super(inspectName);}@Overrideprotected void inspectFunction() {log.info("使用远程视频监控方式巡检……");}@Overrideprotected Double submitInspect() {return 88.88d;}
}

3.3、测试

public static void main(String[] args) {Inspect<Boolean> inspectA = new AInspect("A任务");Boolean resultA = inspectA.startInspect();log.info("A巡视结果:{}", resultA);Inspect<Double> inspectB = new BInspect("B任务");Double resultB = inspectB.startInspect();log.info("B巡视结果:{}", resultB);}

可以看到运行结果,巡检系统A和B分别用不同的方式完成了巡检,且流程一致。

四、小结

        模板方法定义了一个算法的骨架,将一些步骤推迟到子类去实现。如果在我们的项目中,有一个业务流程是固定的,但是实现业务的方式是多变的,我们可以考虑模板方法,来优化我们的代码结构。

        可能有些人分不清楚模板方法和策略模式的区别,这里我区分一下。

        首先就定义和结构方面:模板方法用抽象类定义了一系列的流程,子类继承他的流程,但是可以修改流程某个点的实现方式或者是继承父类的默认实现方式;策略模式是定义一个接口,多个类去实现这个接口,允许客户端在运行时选择使用的策略。

        它们的目的也是不一样的:模板方式是确保各个步骤执行顺序,一定层面上减少重复代码;策略模式是让调用者自由的选择实现方式或行为,且多个实现方式之前可以替换。

        区分谁是谁并不怎么重要,因为在一念之间,他们有可能会相互替换,需要看自己的业务需求。而且很多时候,这两种设计模式可能配合使用,实现拓展和定制,这里我举例一种情况。就拿策略模式这个来说,我这里只写了计算某种材料的计算策略,但是在实际的业务中,我们可能需要统计这一个月或者一年的材料成本量,就简单来说,我们需要算出这一个月的使用量,然后这一年的使用量是这12个月加起来的使用量。这个流程就大致为:计算出某一条记录的成本;计算出一个月的成本;计算出一年的成本。我们就可以定义一个模板方法,算不同材料的年成本。这里我们就可以嵌套进去我们的策略模式,让两者搭配使用,完成业务需求。当然两者配合的场景可能有很多,这里我举得例子可能不是那么恰当,但是也差不多这个意思。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/199038.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在面试中胜出?接口自动化面试题安排上

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

AIGC 技术在淘淘秀场景的探索与实践

本文介绍了AIGC相关领域的爆发式增长&#xff0c;并探讨了淘宝秀秀(AI买家秀)的设计思路和技术方案。文章涵盖了图像生成、仿真形象生成和换背景方案&#xff0c;以及模型流程串联等关键技术。 文章还介绍了淘淘秀的使用流程和遇到的问题及处理方法。最后&#xff0c;文章展望…

从一到无穷大 #19 TagTree,倒排索引入手是否是优化时序数据库查询的通用方案?

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 文章主旨时序数据库查询的一般流程扫描维度聚合时间聚合管控语句 TagTree整体结构索引…

ArkTS - HarmonyOS服务卡片(创建)

可以参考官网文档 其中我们在已有的文件中File > New > Service Widget创建你想要的小卡片 本文章发布时目前可使用的模板就三种 有卡片后的new 最终效果

「Verilog学习笔记」实现3-8译码器①

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 ① 本题要求根据38译码器的功能表实现该电路&#xff0c;同时要求采用基础逻辑门实现&#xff0c;那么就需要将功能表转换为逻辑表达式。 timescale 1ns/1nsmodule d…

K8S基础笔记

1、namespace 名称空间用来对集群资源进行隔离划分&#xff0c;默认只隔离资源&#xff0c;不隔离网络k8s默认的名称空间为default 查看k8s的所有命名空间 kubectl get namespace 或者 kubectl get ns 创建名称空间 kubectl create ns 名称 或使用yaml方式 编写yamlkub…

竞赛 题目:基于大数据的用户画像分析系统 数据分析 开题

文章目录 1 前言2 用户画像分析概述2.1 用户画像构建的相关技术2.2 标签体系2.3 标签优先级 3 实站 - 百货商场用户画像描述与价值分析3.1 数据格式3.2 数据预处理3.3 会员年龄构成3.4 订单占比 消费画像3.5 季度偏好画像3.6 会员用户画像与特征3.6.1 构建会员用户业务特征标签…

应试教育导致学生迷信标准答案惯性导致思维僵化-移动机器人

移动机器人课程群实践创新的困境与突围 一、引言 随着科技的快速发展&#xff0c;工程教育变得越来越重要。然而&#xff0c;传统的应试教育模式往往侧重于理论知识的传授&#xff0c;忽视了学生的实践能力和创新精神的培养。这在移动机器人课程群的教学中表现得尤为明显。本文…

05-Spring Boot工程中简化开发的方式Lombok和dev-tools

简化开发的方式Lombok和dev-tools Lombok常用注解 Lombok用标签方式代替构造器、getter/setter、toString()等重复代码, 在程序编译的时候自动生成这些代码 注解名功能NoArgsConstructor生成无参构造方法AllArgsConstructor生产含所有属性的有参构造方法,如果不希望含所有属…

树莓派通过网线连接电脑(校园网也能连接),实现SSH连接

前言 之前通过串口登入树莓派&#xff0c;太麻烦&#xff0c;通过网络登入树莓派&#xff0c;学校校园网又连接不了&#xff0c;想起来可以使用网线连接树莓派和电脑。 目录 树莓派通过网线连接电脑思路分析 树莓派通过网线连接电脑实现 1.硬件需求 2.打开Windows的网络 …

【高级程序设计】Week2-4Week3-1 JavaScript

一、Javascript 1. What is JS 定义A scripting language used for client-side web development.作用 an implementation of the ECMAScript standard defines the syntax/characteristics of the language and a basic set of commonly used objects such as Number, Date …

Kotlin学习之函数

原文链接 Understanding Kotlin Functions 函数对于编程语言来说是极其重要的一个组成部分&#xff0c;函数可以视为是程序的执行&#xff0c;是真正活的代码&#xff0c;为啥呢&#xff1f;因为运行的时候你必须要执行一个函数&#xff0c;一般从主函数入口&#xff0c;开始一…

ES6中实现继承

本篇文章主要说明在ES6中如何实现继承&#xff0c;学过java的小伙伴&#xff0c;对class这个关键字应该不陌生&#xff0c;ES6中也提供了class这个关键字作为实现类的语法糖&#xff0c;咱们一起实现下ES6中的继承。 实现思路 首先直接通过class来声明一个Teacther类&#xff…

Docker中的RabbitMQ已经启动运行,但是管理界面打不开

文章目录 前言一、解决方法方法一方法二 总结 前言 肯定有好多小伙伴在学习RabbitMQ的过程中&#xff0c;发现镜像运行&#xff0c;但是我的管理界面怎么进不去&#xff0c;或者说我第一天可以进去&#xff0c;怎么第二天进不去了&#xff0c;为什么每次重新打开虚拟机都进不去…

笔记55:长短期记忆网络 LSTM

本地笔记地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\第9章&#xff1a;动手学深度学习~现代循环神经网络 a a a a a a a a a

使用Jupyter Notebook调试PySpark程序错误总结

项目场景&#xff1a; 在Ubuntu16.04 hadoop2.6.0 spark2.3.1环境下 简单调试一个PySpark程序&#xff0c;中间遇到的错误总结&#xff08;发现版对应和基础配置很重要&#xff09; 注意&#xff1a;在前提安装配置好 hadoop hive anaconda jupyternotebook spark zo…

开源与闭源:创新与安全的平衡

目录 一、开源和闭源的优劣势比较 一、开源软件的优劣势 优势 劣势 二、闭源软件的优劣势 优势 劣势 二、开源和闭源对大模型技术发展的影响 一、机器学习领域 二、自然语言处理领域 三、数据共享、算法创新与业务拓展的差异 三、开源与闭源的商业模式比较 一、盈…

使用npm发布自己的组件库

在日常开发中&#xff0c;我们习惯性的会封装一些个性化的组件以适配各种业务场景&#xff0c;突发奇想能不能建一个自己的组件库&#xff0c;今后在各种业务里可以自由下载安装自己的组件。 一. 项目搭建 首先直接使用vue-cli创建一个vue2版本的项目&#xff0c;并下载好ele…

【数据结构】前言

数据结构是在计算机中维护数据的方式。 数据结构是OI重要的一部分。 同的数据结构各有优劣&#xff0c;能够处理的问题各不相同&#xff0c;而根据具体问题选取合适的数据结构&#xff0c;可以大大提升程序的效率。 所以&#xff0c;学习各种各样的数据结构是很有必要的。 数据…

使用 VPN ,一定要知道的几个真相!

你们好&#xff0c;我的网工朋友。 今天想和你聊聊VPN。在VPN出现之前&#xff0c;企业分支之间的数据传输只能依靠现有物理网络&#xff08;例如Internet&#xff09;。 但由于Internet中存在多种不安全因素&#xff0c;报文容易被网络中的黑客窃取或篡改&#xff0c;最终造…