Spring中的设计模式:模板方法模式
目录
导读
什么是模板模式
优点
缺点
简单演示
Spring中的模板模式
模板抽象类
模板方法
抽象方法
具体子类
总结
导读
- 文章首发于微信公众号设计模式:模板模式,原创不易,谢谢支持!!!
模板模式在是Spring底层被广泛的应用,比如事务管理器的实现,JDBC模板的实现。
今天就来谈谈「什么是模板模式」、「模板模式的优缺点」、「模板模式的简单演示」、「模板模式在Spring底层的实现」。
什么是模板模式
模板模式首先要有一个抽象类,这个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
定义:「定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。」
比如在造房子一样,
地基
,铺线
,房子户型
都是一样的,由开发商决定,但是在交房之后,室内的装修风格
和场景布置
却是由业主决定,在这个场景中,开发商其实就是一个抽象类,地基,铺线,房子户型都是可以复用的,但是装修却是不可复用的,必须由业主决定,此时的每一个业主的房子就是一个实现的子类。- 模板方法的实现条件注意:
必须是一个抽象类。
抽象类有一个模板方法,其中定义了算法骨架。
为了防止恶意操作,模板方法必须加上
final
关键词。模板方法中除了复用的代码,其他的关键代码必须是抽象的,子类可以继承实现。
优点
它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
它在父类中提取了公共的部分代码,便于代码复用。
部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。
缺点
对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。
父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。
简单演示
- 比如游戏的运行需要如下几个步骤:
初始化游戏
开始游戏
结束游戏
上述的三个步骤可以是模板类的抽象方法,由具体的子类实现,比如足球游戏。
定义模板类,必须是一个抽象类,模板方法必须是
final
修饰。
public abstract class Game {//抽象方法abstract void initialize();abstract void startPlay();abstract void endPlay();//模板方法public final void play(){//初始化游戏initialize();//开始游戏startPlay();//结束游戏endPlay();}
}
定义实现类,足球游戏,继承模板类,实现其中的三个抽象方法
public class Football extends Game {@Overridevoid endPlay() {System.out.println("足球游戏结束......");}@Overridevoid initialize() {System.out.println("足球游戏初始化中......");}@Overridevoid startPlay() {System.out.println("足球游侠开始了......");}
}
此时写一个测试方法,运行足球游戏,如下:
public class TemplatePatternDemo {public static void main(String[] args) {//创建足球游戏实例Game game = new Football();//开始游戏game.play(); }
}
输出结果如下:
足球游戏初始化中......
足球游侠开始了......
足球游戏结束......
Spring中的模板模式
Spring底层对于模板模式的使用有很多处,今天陈某带大家康康事务管理器是如何使用模板模式的。
模板抽象类
AbstractPlatformTransactionManager
是Spring中的模板抽象类
,来看看它的继承关系图:实现了
PlatformTransactionManager
接口,重载了接口中的方法。
模板方法
事务管理器中抽象类中的模板方法不止一个,比如以下两个方法
//提交事务
public final void commit()//获取TransactionStatus
public final TransactionStatus getTransaction()
这两个方法都对于自己要实现的逻辑搭建了一个骨架,主要的功能是由抽象方法完成,由子类来完成。
抽象方法
事务管理器抽象类中的抽象方法定义了多个,分别用于处理不同的业务逻辑,由子类实现其中具体的逻辑,如下:
//提交事务
protected abstract void doCommit(DefaultTransactionStatus status);//回滚事务
protected abstract void doRollback(DefaultTransactionStatus status);//开始事务
protected abstract void doBegin(Object transaction, TransactionDefinition definition)//获取当前的事务对象
protected abstract Object doGetTransaction()
抽象方法的定义便于子类去扩展,在保证算法逻辑不变的情况下,子类能够定制自己的实现。
具体子类
事务管理器的模板类有很多的具体子类,如下图:
其中我们熟悉的有
DataSourceTransactionManager
、JtaTransactionManager
、RabbitTransactionManager
。具体承担什么样的角色和责任不是本节的重点,不再细说。
总结
模板模式是一个很重要,易扩展的模式,提高了代码复用性,在Spring中有着广泛的应用,比如
JDBCTemplate
,AbstractPlatformTransactionManager
,这些实现都用到了模板模式。如果觉得陈某的文章能够对你有所帮助,有所启发,关注分享一波,点个在看,谢谢支持!!!
Spring中的设计模式:模板方法模式相关推荐
- JDK和Spring中的设计模式
JDK中的设计模式(17) 创建型 1)工厂方法 Collection.iterator() 由具体的聚集类来确定使用哪一个Iterator 2)单例模式 Runtime.getRuntime() 3 ...
- spring的钩子_模板方法模式——看看 JDK 和 Spring 是如何优雅复用代码的
前言模板,顾名思义,它是一个固定化.标准化的东西.模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤. 场景问题 程序员不愿多扯,上来先 ...
- Spring 中的设计模式
spring 中的设计模式 单例模式: bean 默认都是单例的 工厂模式: BeanFactory 模板方法: postProcessBeanFactory.onRefresh.initProper ...
- JAVA 设计模式 模板方法模式
定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模 ...
- 在一个程序设计里,不同的功能窗口有着相似的功能实现方式,可采用设计模式---模板方法模式
前段时间学习了一些设计模式,最近在做项目的过程中恰巧用到了其中的一个--模板方法模式.这个模式在程序设计过程中可是为小编省去了不少的代码量呢.具体是怎样应用的呢?接下来小编为您分享. 前面博文 ...
- 『设计模式』瑞幸咖啡还是星巴克,一杯下午茶让我明白 设计模式--模板方法模式(Template Method Pattern)
23种设计模式+额外常用设计模式汇总 (持续更新) 简介 Define the skeleton of an algorithm in an operation,deferring some step ...
- 『设计模式』设计模式--模板方法模式
23种设计模式+额外常用设计模式汇总 (持续更新) 简介 Define the skeleton of an algorithm in an operation,deferring some step ...
- 行为型设计模式---模板方法模式
设计模式 序号 内容 链接地址 1 设计模式七大原则 https://blog.csdn.net/qq_39668819/article/details/115390615 2 创建型设计模式–工厂模 ...
- Java设计模式-模板方法模式详解
Java设计模式-模板方法模式 文章目录 Java设计模式-模板方法模式 0.前言 1.模板方法原理 2.模板方法模式中的角色 3.模板方法模式的UML类图 4.代码实现 5.编码测试 6.模板模式中 ...
- 工作中的设计模式 —— 策略模式
前言 返利网站 https://m.cpa5.cn/ 策略模式是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换. 使用场景 策略模式在工作中使用的 ...
最新文章
- GMM_example(1)
- rxjava背压_如何形象地描述RxJava中的背压和流控机制?
- django06: ORM示例2--uer 与file
- 更便捷的画决策分支图的工具_做出更好决策的3个要素
- 有史以来最详细 安装部署Kubernetes Dashboard (补充解决官方出现的一些RBAC CERT等问题)
- 虚拟linux系统首次登入,第一次在虚拟机启动我们的Linux系统
- IIS下发布关于Excel导入导出时遇到的问题集锦
- 小甲鱼python电子版_小甲鱼学python
- Mac 安装和配置 Maven
- 尚硅谷Javaweb教程书城项目订单模块完整版
- Python中文文档概览
- 电信dns地址是多少?
- 作为一个新手程序员该如何成长
- 多级表头 el-table-column的使用
- 七月上伴奏计算机按键,数字化音乐专业教室配备方案(7页)-原创力文档
- XUL 用户界面语言介绍
- SHELL脚本之awk妙用
- 乐讯机器人精简版2016迎春版【隆重发布】
- js 获取当前环境全局对象
- tsc条码标签打印机维修故障有哪些
热门文章
- 罗纳尔多~~~~~~
- 计算机仿真模拟在装配,飞机装配仿真中数字人模型及工人姿态的模拟
- PHY芯片快速深度理解(持续更新中……)
- 计算机学院寝室文明风景线活动,弘扬寝室文化,建设文明寝室——数计学院开展寝室文化节活动!...
- Stacking算法预测银行客户流失率
- 计算机工程学院运动会口号,精选励志的运动会口号合集53句
- 全面的数据库管理工具——DBeaver Enterprise
- 游戏开发之旅——使用CocosCreator完成卡牌2048主要逻辑
- File not found:'*.dcu'解决办法
- mouseleave与mouseout的区别