23种设计模式之模板方法模式(模板模式)

23种设计模式之模板方法模式(模板模式)

文章目录

  • 23种设计模式之模板方法模式(模板模式)
    • 设计思想
    • 模板方法的优缺点
    • 模板方法模式的缺点
    • 代码解析
    • 小结

设计思想

原文:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
以上原文,我们可以抠出几个关键字

  • 算法的骨架
  • 些许步骤延迟到子类
  • 算法结构不可变
  • 重定义特定步骤

以上四点是我个人觉得比较重要的点,我们先模拟去上班的场景,早上需要去上班那么肯定是有这几个选项的
①:洗脸刷牙
②:出行交通工具的选择
③:选择上班路线
以上三点就是我们的去上班需要干的事,我们可以将这三件事当成算法的骨架,随后我们可以将第②和第③这两个步骤延迟到子类(将实现交给子类)。看到关键字三,算法结构不可变,其实也就是说整个去上班的步骤顺序不可变化,关键字四重定义特定步骤,思考一下起床洗脸刷牙基本固定(不要抬杠)只有步骤②和③是多变的,有可能你选择坐公交但是每一辆公交路线是不一致的,所以我们可以将这些步骤交给子类是实现。

模板方法的优缺点

模板方法模式的优点

  • 算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改。
  • 实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。
  • 既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。
  • 提供了一个基本框架,容易扩展子类。模板方法有框架控制如何做事情,而由使用框架的人指定框架算法中每个步骤的细节。子 类只要继承父类,实现抽象方法,就可以使用父类的算法。

模板方法模式的缺点

  • 类数目的增加:每一个抽象类都需要一个子类来实现,这样导致类的个数增加。
  • 类数量的增加导致系统实现的复杂度提高。
  • 继承关系的缺点:如果父类添加新的抽象方法,所有子类都要改一遍。
    模板方法模式的实际应用
    在实际的开发中,有一些常用的框架和库使用了模板方法(Template Method)设计模式,以下是其中的几个例子:

Servlet:Servlet 是 JavaEE 中常用的 Web 开发框架,它使用了模板方法设计模式来处理 HTTP 请求和响应。在 Servlet 中,抽象类 HttpServlet 定义了模板方法 service(),子类需要继承 HttpServlet 并重写 service() 方法来处理具体的请求和生成响应。

Spring Framework:Spring 是一个广泛使用的应用程序开发框架,其中的一些子框架也使用了模板方法设计模式。比如,在 Spring Web MVC 框架中,HandlerInterceptor 接口定义了多个模板方法,如 preHandle()、postHandle() 和 afterCompletion(),用于处理请求拦截和后置处理等操作。

Hibernate 框架:Hibernate 是一个用于对象关系映射(ORM)的框架,它使用了模板方法设计模式来定义数据库访问的基本骨架。比如,在 Hibernate 中,Session 是一个抽象类,它定义了一系列的模板方法,如 save()、update() 和 delete(),用于执行数据库操作。

Android 开发中的 Activity 和 Fragment:在 Android 开发中,Activity 和 Fragment 是常用的组件,它们在生命周期管理和用户交互等方面使用了模板方法设计模式。比如,在 Activity 中,onCreate()、onStart() 和 onDestroy() 等方法作为模板方法,开发人员可以重写这些方法来提供自己的业务逻辑。

代码解析

在这里插入图片描述

//抽象类
public abstract class Work {/*** 定义模板方法*/public final void goToWork(String name) {System.out.println(name + "起床了");System.out.println(name + "叠被子了");System.out.println(name + "刷牙了");System.out.println(name + "洗脸了");System.out.println(name + "开始选择座驾");this.rideVehicle();System.out.println("以选择以下行驶路线");this.selectPath();}/*** 乘坐交通工具*/abstract void rideVehicle();/*** 选择路线*/abstract void selectPath();
}
/员工A
public class StaffA extends Work {void rideVehicle() {System.out.println("乘坐五菱宏光");}void selectPath() {System.out.println("无拥堵情况,却距离较远");}}

//员工B
public class StaffB extends Work {void rideVehicle() {System.out.println("乘坐劳斯莱斯幻影");}void selectPath() {System.out.println("拥堵却距离较近的路线");}
}
public class Test {public static void main(String[] args) {StaffA staffA = new StaffA();staffA.goToWork("王思葱");}
}

在这里插入图片描述

public class Test {public static void main(String[] args) {StaffB staffB = new StaffB();staffB.goToWork("王思冲");}
}

在这里插入图片描述

小结

分别运行StaffA以及StaffB这两个类我们可以看到整个的步骤顺序是没有变的,只有交通工具以及路线发生了变化,个人认为代码已经诠释了模板模式的精髓,我们平时出现多个类似的功能功能点比如解析DOC文件或者XLSX等不同的文件,前期一些初始化的操作可以封装到模板方法中,到了具体解析哪一种类型的文件,再去交给子类实现。我们可以自己去想一些场景,通过编码增强自己对该模式的理解。
模板模式相对比较简单一些吧,希望能够领悟到我列举的四个关键词条,早日使用到实际项目中。

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

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

相关文章

jsp文件引用的css修改后刷新不生效问题

问题 在对 JavaWeb 项目修改的过程中,发现修改了 jsp 文件引入的 css 文件的代码后页面的样式没有更新的问题。 原因 导致这个问题的原因可能是因为浏览器缓存的问题。 解决方法 下面介绍两种解决方法,供大家参考: 1、给 link 标签的 c…

件夹和文件比较软件VisualDiffer mac功能介绍

VisualDiffer mac是一款运行在MacOS上的文件夹和文件快速比较工具。VisualDiffer可以对不同文件夹中文件或文档做出比较或者比较两个文件的路径。还可以通过UNIS diff命令快速、标准和可靠的比较出各类不同的文件夹和文件结果,使用不同的颜色直观地显示。 VisualDif…

网络基础(五):网络层协议介绍

目录 一、网络层 1、网络层的概念 2、网络层功能 3、IP数据包格式 二、ICMP协议 1、ICMP的作用和功能 2、ping命令的使用 2.1ping命令的通用格式 2.2ping命令的常用参数 2.3TypeCode:查看不同功能的ICMP报文 2.4ping出现问题 3、Tracert 4、冲突域 5、…

GoLong的学习之路,进阶,微服务之序列化协议,Protocol Buffers V3

这章是接上一章,使用RPC包,序列化中没有详细去讲,因为这一块需要看的和学习的地方很多。并且这一块是RPC中可以说是最重要的一块,也是性能的重要影响因子。今天这篇主要会讲其使用方式。 文章目录 Protocol Buffers V3 背景以及概…

安装ThingBox Eclipse Plugin

1. ChatGPT问 The latest version of the ThingBox Eclipse Plugin requires Eclipse IDE 2021-06 or later. 2. PTC官网下载 MED-61378-CD-092_F000_Eclipse-Plugin-9-0-1.zip文件, 和 MED-61098-CD-085_F000_ThingWorx-Extension-SDK-8-5-0(需要账号&#xff09…

深入理解模板引擎:解锁 Web 开发的新境界(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

STM32-固件打包部署

STM32-固件打包部署 Fang XS.1452512966qq.com STM32固件输出 工程上使用Keil开发STM32软件;在调试过程中,可直接编译下载;例如bootloader和APP,在调试时,可以直接下载2次;但是工程上,需要大…

多维时序 | MATLAB实现RIME-CNN-BiLSTM-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现RIME-CNN-BiLSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现RIME-CNN-BiLSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现RIME-…

先进的Web3.0实战热门领域NFT项目几个总结分享

非同质化代币(NFT)的崛起为游戏开发者提供了全新的机会,将游戏内物品和资产转化为真正的可拥有和交易的数字资产。本文将介绍几个基于最先进的Web3.0技术实践的NFT游戏项目,并分享一些相关代码。 Axie Infinity(亚龙无…

【网络协议】LACP(Link Aggregation Control Protocol,链路聚合控制协议)

文章目录 LACP名词解释LACP工作原理互发LACPDU报文确定主动端确定活动链路链路切换 LACP和PAgP有什么区别?LACP与LAG的关系LACP模式更优于手动模式LACP模式对数据传输更加稳定和可靠LACP模式对聚合链路组的故障检测更加准确和有效 推荐阅读 LACP名词解释 LACP&…

科技提升安全,基于YOLOv5系列模型【n/s/m/l/x】开发构建商超扶梯场景下行人安全行为姿态检测识别系统

在商超等人流量较为密集的场景下经常会报道出现一些行人在扶梯上摔倒、受伤等问题,随着AI技术的快速发展与不断普及,越来越多的商超、地铁等场景开始加装专用的安全检测预警系统,核心工作原理即使AI模型与摄像头图像视频流的实时计算&#xf…

IPIDEA科普大数据企业怎样使用IP代理工具进行数据抓取

相信有很多的朋友都很好奇一件事,一般大数据企业需要拥有海量的数据才能够进行数据分析整理和利用,那么他们都是如何抓取到这么多的数据呢?这些企业在抓取数据时都会使用什么工具,今天就跟大家科普一下。 其实大数据企业在进行数…