《程序猿之设计模式实战 · 模板方法》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗

🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

      • 写在前面的话
      • 基础介绍
      • 代码实现
      • Spring 中的模板方法
      • Servlet中的模板方法
      • 扩展补充
      • 总结陈词

写在前面的话

本篇文章继续介绍一下观察者模式,这个在日常工作中接触还是挺多的,但和发布订阅模式又有什么不同呢?

相关文章:
《程序猿之设计模式实战 · 策略模式》
《程序猿之设计模式实战 · 装饰者模式》
《程序猿之设计模式实战 · 池化思想》
《程序猿之设计模式实战 · 观察者模式》
《程序猿之设计模式实战 · 责任链模式》


基础介绍

基础概念:

1、模板方法设计模式是一种行为型设计模式,它定义了一个算法的骨架,而将一些步骤延迟到子类中。模板方法允许子类在不改变算法结构的情况下重新定义算法的某些特定步骤。

2、模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

Tips:看起来是否好像就是 Java 抽象类的用法呢?

模板方法的结构:

模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术。模板方法模式需要开发抽象类和具体子类的设计师之间的协作。一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤。代表这些具体逻辑步骤的方法称做基本方法;而将这些基本方法汇总起来的方法叫做模板方法,这个设计模式的名字就是从此而来。

主要组成部分:

1、抽象类:定义了一个模板方法,包含算法的骨架。定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤。

2、具体类:实现了抽象类中定义的某些步骤。实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤。

使用场景:

  • 当你有一个算法的多个变体时,可以使用模板方法模式来避免重复代码。
  • 当你希望控制子类扩展的步骤,但不希望改变算法的整体结构时。
  • 在框架设计中,提供一个可扩展的基础结构。

代码实现

// 抽象类
abstract class AbstractClass {// 模板方法public final void templateMethod() {stepOne();stepTwo();stepThree();}protected abstract void stepOne();protected abstract void stepTwo();// 具体实现private void stepThree() {System.out.println("Step Three: Common Implementation");}
}// 具体类A
class ConcreteClassA extends AbstractClass {@Overrideprotected void stepOne() {System.out.println("ConcreteClassA: Step One Implementation");}@Overrideprotected void stepTwo() {System.out.println("ConcreteClassA: Step Two Implementation");}
}// 具体类B
class ConcreteClassB extends AbstractClass {@Overrideprotected void stepOne() {System.out.println("ConcreteClassB: Step One Implementation");}@Overrideprotected void stepTwo() {System.out.println("ConcreteClassB: Step Two Implementation");}
}// 测试
public class TemplateMethodDemo {public static void main(String[] args) {AbstractClass classA = new ConcreteClassA();classA.templateMethod();System.out.println();AbstractClass classB = new ConcreteClassB();classB.templateMethod();}
}

Spring 中的模板方法

在 Spring 框架中,模板方法模式被广泛应用于各种组件中,尤其是在数据访问和事务管理方面。以下是一些常见的应用场景:

1、JdbcTemplate:Spring 提供的 JdbcTemplate 类使用模板方法模式来简化 JDBC 操作。用户只需实现特定的回调方法,而不需要关心底层的 JDBC 细节。

2、事务管理:Spring 的事务管理也使用了模板方法模式,允许用户定义事务的边界,而具体的事务处理逻辑则由 Spring 处理。

3、RestTemplate:在进行 RESTful 服务调用时,RestTemplate 提供了一系列的模板方法,用户只需关注请求的具体细节。

总结:模板方法设计模式通过定义算法的骨架,使得子类可以灵活地实现特定的步骤。这种模式在 Spring 框架中得到了广泛应用,极大地简化了开发过程,提高了代码的可复用性和可维护性。


Servlet中的模板方法

使用过Servlet的人都清楚,除了要在web.xml做相应的配置外,还需继承一个叫HttpServlet的抽象类。HttpService类提供了一个service()方法,这个方法调用七个do方法中的一个或几个,完成对客户端调用的响应。这些do方法需要由HttpServlet的具体子类提供,因此这是典型的模板方法模式。


扩展补充

看上面的介绍,模板方法好像就是Java抽象类的基础用法,公用部分的代码写在抽象类,特殊的子类自己定义,这有什么特殊之处吗?

其实两者还是有一些区别:

  1. 算法的骨架与步骤的分离

模板方法模式明确区分了算法的整体结构(骨架)和具体实现(步骤)。这使得算法的变化和扩展变得更加灵活。子类只需关注特定步骤的实现,而不需要重新实现整个算法。

  1. 控制扩展

模板方法模式允许父类控制算法的执行流程,确保子类只能在特定的步骤中进行扩展。这种控制机制有助于维护算法的一致性和完整性。

  1. 代码复用

通过将公共逻辑放在抽象类中,模板方法模式促进了代码的复用。多个子类可以共享相同的逻辑,减少了代码重复。

  1. 易于维护

由于算法的结构在父类中定义,任何对算法结构的修改只需在父类中进行,而不需要在每个子类中重复修改。这提高了代码的可维护性。

  1. 适应性

模板方法模式可以很容易地适应变化。例如,如果需要在算法中添加新的步骤,只需在抽象类中添加方法,并在子类中实现即可。

  1. 与钩子方法结合使用

模板方法模式通常与钩子方法结合使用。钩子方法是一些可以被子类选择性重写的方法,允许子类在不改变算法结构的情况下插入自定义行为。


总结陈词

介绍了这么多,其实模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术。也不用过多纠结它和抽象方法的区别是什么,在日常中学会使用这种抽象或模板封装思维,才是最重要的。遇到实际问题能使用合适的方式解决,同时代码经得起推敲和扩展,才是最主要的。

还是那句话,你可以不用,但不能不会。

💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

NodeJs文档

文件操作 // 1. 导入fs模块 const fs require(fs)文件写入 //异步写入 // fs.writeFile(文件名, 待写入的数据, 选项设置(可选), 回调函数) fs.writeFile(./座右铭.txt, 三人行,必有我师傅, err > {/…

专注并不意味只做一件事

原创内容第658篇,专注量化投资、个人成长与财富自由。 财务自由本身就是一个很有争议的领域。 有谁能靠别人实现财富自由呢? 这个逻辑起点本身就有问题。 如果预期正确,那这些自媒体还是有用处的。 好比我现在对于阅读和书籍的预期&…

看过来!这水凝胶,机械强、抗冻佳、导电优

大家好,如今智能穿戴设备越来越普及,但传统传感器有不少局限性。比如说,传统水基水凝胶用作柔性传感器材料时,保水性和抗冻性就不太好,这会影响其稳定性和应用范围。那有没有什么办法解决这些问题呢?今天我…

增强现实系列—Real-Time Simulated Avatar from Head-Mounte

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

软考流水线计算

某计算机系统输入/输出采用双缓冲工作方式,其工作过程如下图所示,假设磁盘块与缓冲区大小相同,每个盘块读入缓冲区的时间T为10μs,由缓冲区送至用户区的时间M为6μs,系统对每个磁盘块数据的处理时间C为2μs。若用户需要…

SaaS业务架构:业务能力分析

大家好,我是汤师爷~ 今天聊聊SaaS业务架构的业务能力分析。 业务能力概述 简单来说,业务能力是企业“做某事的能力”。 业务能力描述了企业当前和未来应对挑战的能力,即企业能做什么或需要做什么。业务能力建模的关键在于定义了企业做什么…

linux 安装libreoffice

yum install libreoffice 有点大有一个G

libreoffice word转pdf

一、准备一个word文件 运行: cd /root libreoffice --headless --convert-to pdf --outdir /root/output doc1.docx 发现中文乱码: 此时我们需要给linux 上添加中文字体: centos7 添加中文字体 再次运行正常: libreoffice --h…

中断-MCU

中断 目录 中断 中断的概念 中断的执行过程 中断服务函数 中断的部分专业术语 – 了解 STM32中的中断分类 嵌套向量中断控制器 NVIC STM32中的中断优先级 中断编程 外部中断(单片机之外)之EXTI中断 相关寄存器 外部中断(EXTI&am…

EdgeRoute_镜像烧录

1. EdgeRouter 概述 EdgeRouter Lite 是由 Ubiquiti Networks 公司生产的一款高性能网络路由器,适用于家庭和小型办公环境。它的尺寸为200 x 90 x 30 mm,重量为345克,配备了双核500 MHz的MIPS64处理器,并带有硬件加速功能&#x…

《AI系统:原理与架构》于华为HC大会2024正式发布

2024年9月21日,《AI系统:原理与架构》新书发布会在上海世博馆华为HC大会顺利举办。本书由华为昇腾技术专家、B站AI科普博主ZOMI酱和哈工大软件学院副院长苏统华教授联合编写,是领域内AI系统方面填补空白的重磅之作。 发布会上,《A…

机器人学基础——旋转矩阵转四元数的C++程序实现

一、理论基础 1. 旋转矩阵 旋转矩阵通常是一个3x3矩阵,表示物体的旋转变换。一个标准的旋转矩阵 ( R ) 如下: R ( r 11 r 12 r 13 r 21 r 22 r 23 r 31 r 32 r 33 ) R \begin{pmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} &am…

github demo网页制作

demo网页制作 1.创建一个空项目 2.上传编辑好的文件到本地服务器 3.申请一个token 4.本地项目夹下执行 git init git add --all git commit -m ‘first try’ git remote add origin https://github.com/username/reponame.git git push -u origin master 这个时候需要输入用…

在曲线图上最值和极值点位置进行适当标注

1、首先生成一组0-100的随机数,组内共有100个数据; yyrandi([0,100],[1,100]); 2、求这组数据的功率谱密度,并绘图; msize(yy,2); xdft fft(yy); % 计算功率谱密度 psd (1/m) * abs(xdft).^2; x1:m; loglog(x,psd,Linewid…

树及二叉树(选择题)

树 在树中,总结点数为所有结点的度和再加一 5、设一棵度为3的树,其中度为2,1.0的结点数分别为3,1,6。该树中度为3 的结点数为_。 二叉树 设二叉树的所有节点个数为N,度为零的结点(叶子结点…

基于Java springboot+mybatis 家具城进销存管理系统 (1)

基于Java springbootmybatis 家具城进销存管理系统 一、系统介绍二、功能展示1.登记出库(销售员)2.出库记录(销售员)3.首页(仓库管理员)4.出库管理(仓库管理员)5.统计分析(仓库管理员)6.账号管理&#xff0…

8588 表达式求值

### 思路 1. **初始化栈**:创建两个栈,一个用于存储操作数,另一个用于存储操作符。 2. **遍历表达式**:逐个字符检查: - 如果是数字,读取完整数字并压入操作数栈。 - 如果是操作符,根据优…

asp.net门诊管理系统网站(含协同过滤算法)VS开发sqlserver数据库web结构c#编程web网页设计

一、源码特点 asp.net门诊管理系统网站是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语言 开发。 应用技术:asp.net c…

x-cmd pkg | bat: cat 命令现代化替代品,终端用户必备工具

目录 简介快速上手安装使用与第三方工具组合使用 功能特点竞品和相关作品进一步阅读 简介 bat 是由 github.com/sharkdp 用 Rust 开发的 cat 命令现代化替代品。它比 cat 命令扩展了更多的现代化功能,如语法高亮、自动分页、Git集成等,能为用户提供更为…

[001-02-001].第2节:java开发环境搭建

4.1.书籍推荐: 4.2.人机交互方式 1.图形化界面(Graphical User Interface GUI)这种方式简单直观,使用者易于接受,容易上手操作2.命令行方式(Command Line Interface CLI):需要有一个控制台,输入特定的指令&#xff0c…