模板方法模式(Template Method)

模板方法模式是一种行为设计模式,在超类中定义了一个算法的框架,而将一些步骤的实现延迟到子类中,使得子类可重定义该算法的特定步骤。

Template Method is a behavior design pattern. It defines an algorithm framework in the superclass, 
but delays the implementation of some steps to subclasses, so that subclasses can redefine specific steps 
of the algorithm.  

结构设计

模板方法模式包含如下角色:
Abstract ­Class,抽象类,实现一个模板方法,定义了算法的骨架。需要说明的是,算法中的步骤可以被声明为抽象类型,也可以提供一些默认实现。
Concrete­ Class,具体类,按需实现算法步骤,但不能重写模板方法自身。
模板方法模式类图表示如下:
请添加图片描述
一个模板方法用一些抽象的操作定义一个算法,而子类将重定义这些操作以提供具体的行为。通过使用抽象操作定义一个算法的一些步骤,模板方法确定了它们的先后顺序,但允许子类改变这些具体步骤以满足它们各自的需求。

伪代码实现

接下来将使用代码介绍下模板方法模式的实现。

// 1、抽象类,实现一个模板方法,定义了算法的骨架
public abstract class AbstractClass {// 将方法声明为final,表示该方法不可overridepublic final void templateMethod() {operation1();operation2();}protected abstract void operation1();protected abstract void operation2();
}//2、具体类,按需实现算法步骤
public class ConcreteClassA extends AbstractClass {@Overrideprotected void operation1() {System.out.println("operation1 in a ConcreteClassA instance");}@Overrideprotected void operation2() {System.out.println("operation2 in a ConcreteClassA instance");}
}
public class ConcreteClassB extends AbstractClass {@Overrideprotected void operation1() {System.out.println("operation1 in a ConcreteClassB instance");}@Overrideprotected void operation2() {System.out.println("operation2 in a ConcreteClassB instance");}
}// 3、客户端
public class TemplateMethodClient {public void test() {// (1) 创建具体类示例AbstractClass classA = new ConcreteClassA();// (2) 调用模板方法classA.templateMethod();AbstractClass classB = new ConcreteClassB();classB.templateMethod();}
}

适用场景

在以下情况下可以考虑使用模板方法模式:
(1) 如果只希望子类扩展某个特定算法步骤,而不是整个算法或其结构时,可考虑使用模板方法模式。模板方法将整个算法转换为一系列独立的步骤,以便子类能对其进行扩展,同时还可让超类中所定义的结构保持完整。
(2) 当多个类的算法除一些细微不同之外几乎完全一样时, 可使用该模式。但其后果就是,只要算法发生变化,就可能需要修改所有的类。在将算法转换为模板方法时,可将相似的实现步骤提取到超类中以去除重复代码。子类间各不同的代码可继续保留在子类中。

优缺点

模板方法模式有以下优点:
(1) 仅允许子类重写算法中的特定部分,使得算法其他部分修改对其所造成的影响减小。
(2) 可将重复代码提取到父类中。
但是该模式也存在以下缺点:
(1) 部分子类可能会受到算法框架的限制。如果算法框架需要调整,则该模式不适用。
(2) 通过子类抑制默认步骤实现可能会导致违反里氏替换原则。
(3) 每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大。模板方法中的步骤越多, 其维护工作就可能会越困难。

参考

《设计模式 可复用面向对象软件的基础》 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides 著, 李英军, 马晓星等译
https://refactoringguru.cn/design-patterns/visitor 模板方法模式
https://www.runoob.com/design-pattern/visitor-pattern.html 模板方法模式
https://www.cnblogs.com/adamjwh/p/10968634.html 简说设计模式——模板方法模式

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

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

相关文章

企业运单管理教程

随着电子面单的普及,以及商务寄件稳步增加,快递公司为了留住商企客户,推出了月结协议模式寄件。企业可以根据寄件量大小,和快递公司签订月结协议,运费每月结算一次,还能根据自身的寄件量,向快递…

[C语言]深入浅出,带你构建C语言宏观框架

导言: 本文章会带你基本了解C语言,对他有一个感性的认识,对其有一个框架,后期在对其进行更加细致的补充。 文章目录 C语言第一个函数变量局部变量 与 全局变量常量字符串 与 转义字符 头文件分支 与 循环注释数组关键字操作符宏指…

VS + Qt Include宏指向的路径错误或者project特性的值无效

如果你电脑上有多个Qt版本,不同项目又依赖不同的Qt版本,就会偶尔出现Qt Include宏指向的Qt路径并不是当前依赖的Qt路径。有时候还会出现project特性的值无效,路径中含有非法字符错误,如下图所示 这个问题的解决办法就是删除工程目…

Docker容器监控(Cadvisor +Prometheus+Grafana)

环境部署,接着上一篇文章Docker容器部署(Cadvisor InfluxDBGrafana)开始 目录 1、先清理一下容器 2、部署Cadvisor 3、访问Cadvisor页面 4、部署Prometheus 5、准备配置 6、运行prometheus容器 7、访问prometheus页面 8、部署Grafan…

软件测试面试题——如何测试App性能?

为什么要做App性能测试? 如果APP总是出现卡顿或网络延迟的情况,降低了用户的好感,用户可能会抛弃该App,换同类型的其他应用。如果APP的性能较好,用户体验高,使用起来丝滑顺畅,那该应用的用户粘…

Spring IoC 详解

目录 一、引言二、Spring Bean三、将一个类声明为 Bean 所涉及的注解四、Component 和 Bean 的区别五、注入 Bean 的注解六、Autowired 和 Resource 的区别七、Bean7.1 作用域7.2 线程安全7.3 生命周期 一、引言 IoC(Inversion of Control:控制反转) 是…

【01】基础知识:typescript安装及使用,开发工具vscode配置

一、typescript 了解 typeScript 是由微软开发的一款开源的编程语言。 typeScript 是 javascript 的超级,遵循最新的 es6、es5规范。 typeScript 扩展了 javaScript 的语法。 typeScript 更像后端 java、C# 这样的面向对象语言,可以让 js 开发大型企…

CANdelaStudio 使用介绍

CANdela Studio使用_哔哩哔哩_bilibili 一.CANdelaStudio使用tips 1.开始菜单打开软件,避免软件字体是德文的 2.打开软件之后,用“Open”打开.cdd或者.cddt文件,不要双击文件打开,这样容易报错 3.查看软件版本信息 4.只有Admin版…

探索规律:Python地图数据可视化艺术

文章目录 一 基础地图使用二 国内疫情可视化图表2.1 实现步骤2.2 完整代码2.3 运行结果 一 基础地图使用 使用 Pyecharts 构建地图可视化也是很简单的。Pyecharts 支持多种地图类型,包括普通地图、热力图、散点地图等。以下是一个构建简单地图的示例,以…

灰度均衡变换之c++实现(qt + 不调包)

1.基本原理 灰度均衡是以累计分布函数变换为基础的直方图修正法,它可以产生一副灰度级分布概率均匀的图像。也就是说,经过灰度均衡后的图像在没一级灰度上像素点的数量相差不大。公式见下图,为灰度值为x的像素点的个数,n为总像素点…

回归预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门…

十一、结合数字孪生与时间技术进行多维分析设计与实施

大数据可视化中心以主题为分析对象,选择业务分类下的某个主题,可以在数据面板中展示其二维图表,在地图中标记其空间分布,并叠加其相应的二维或三维图层。 1、界面设计 其主界面设计详上图,各部分功能介绍如下: 1.1、主题与图层面板,从上到下,从左到右分别是: ①折…

高压放大器如何正常使用的呢

高压放大器是一种用于将低电压信号转换成高电压信号的电子设备。它广泛应用于通信、雷达、医疗设备等领域。正确使用高压放大器对于保证设备的正常运行和延长使用寿命至关重要。下面安泰将介绍高压放大器的使用方法和注意事项,帮助您更好地了解如何正确使用高压放大…

Python基础小项目

今天给大家写一期特别基础的Python小项目,欢迎大家支持,并给出自己的完善修改 (因为我写的都是很基础的,运行速率不是很好的 目录 1. 地铁票价题目程序源码运行截图 2. 购物车题目程序源码运行截图 3. 名片管理器题目程序源码运行…

使用vscode远程登录以及本地使用的配置(插件推荐)

1、远程登陆ssh 1.1打开vscode插件商店,安装remote-ssh插件 远程ssh添加第三方插件:vscode下链接远程服务器安装插件失败、速度慢等解决方法_vscode远程安装不上扩展_Emphatic的博客-CSDN博客 转到定义,选中代码->鼠标右键->转到定义…

基于Java+SpringBoot+Vue的数码论坛系统设计与实现(源码+LW+部署文档等)

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Mongodb 安装

一、win10安装 服务端下载地址:Download MongoDB Community Server | MongoDB shell 工具下载地址:MongoDB Shell Download | MongoDB 服务端安装时选择custom,否则安装文件没有bin目录。 将安装后的文件中的bin目录加到环境变量。 设置…

CAD转kml插件acad2kml分享下载

KML(Keyhole Markup Language)是一种用于描述地理数据的格式,它由Google公司开发并在2008年成为开放标准。KML使用XML语法,可以用于表示地理点、线、多边形、图像覆盖物以及相关属性信息。 KML是一种用于描述地理数据的开放格式&…

sklearn中使用决策树

1.示例 criterion可以是信息熵,entropy,可以是基尼系数gini # -*-coding:utf-8-*- from sklearn import tree from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split wineload_wine()# print ( wine.feature_…

【uniapp】uniapp打包H5(网页端):

文章目录 一、设置appid:二、设置router:三、打包:【1】[CLI 发行uni-app到H5:https://hx.dcloud.net.cn/cli/publish-h5](https://hx.dcloud.net.cn/cli/publish-h5)【2】HBuilderX 四、最终效果: 一、设置appid&…