导读

  • 模板模式在是Spring底层被广泛的应用,比如事务管理器的实现,JDBC模板的实现。
  • 文章首发于作者的微信公众号【码猿技术专栏】
  • 今天就来谈谈「什么是模板模式」「模板模式的优缺点」「模板模式的简单演示」「模板模式在Spring底层的实现」

什么是模板模式

  • 模板模式首先要有一个抽象类,这个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
  • 定义:「定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。」
  • 比如在造房子一样,地基铺线房子户型都是一样的,由开发商决定,但是在交房之后,室内的装修风格场景布置却是由业主决定,在这个场景中,开发商其实就是一个抽象类,地基,铺线,房子户型都是可以复用的,但是装修却是不可复用的,必须由业主决定,此时的每一个业主的房子就是一个实现的子类。
  • 模板方法的实现条件注意:
    1. 必须是一个抽象类。
    2. 抽象类有一个模板方法,其中定义了算法骨架。
    3. 为了防止恶意操作,模板方法必须加上final关键词。
    4. 模板方法中除了复用的代码,其他的关键代码必须是抽象的,子类可以继承实现。

优点

  • 它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
  • 它在父类中提取了公共的部分代码,便于代码复用。
  • 部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。

缺点

  • 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。
  • 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。

简单演示

  • 比如游戏的运行需要如下几个步骤:上述的三个步骤可以是模板类的抽象方法,由具体的子类实现,比如足球游戏。
    1. 初始化游戏
    2. 开始游戏
    3. 结束游戏
  • 定义模板类,必须是一个抽象类,模板方法必须是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 {

   @Override
void endPlay() {
System.out.println("足球游戏结束......");
} @Override
void initialize() {
System.out.println("足球游戏初始化中......");
} @Override
void 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()
  • 抽象方法的定义便于子类去扩展,在保证算法逻辑不变的情况下,子类能够定制自己的实现。

具体子类

  • 事务管理器的模板类有很多的具体子类,如下图:
  • 其中我们熟悉的有DataSourceTransactionManagerJtaTransactionManagerRabbitTransactionManager。具体承担什么样的角色和责任不是本节的重点,不再细说。

总结

  • 模板模式是一个很重要,易扩展的模式,提高了代码复用性,在Spring中有着广泛的应用,比如JDBCTemplate,AbstractPlatformTransactionManager,这些实现都用到了模板模式。
  • 如果觉得陈某的文章能够对你有所帮助,有所启发,关注分享一波,点个在看,谢谢支持!!!

Spring中的设计模式:模板模式的更多相关文章

  1. 【转】Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式

    [转]Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式 博客分类: 企业应用面临的问题 java并发编程 Struts2的线程安全ThreadLocal模式St ...

  2. 12. 星际争霸之php设计模式--模板模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. Spring中的设计模式

    [Spring中的设计模式] http://www.uml.org.cn/j2ee/201301074.asp [详解设计模式在Spring中的应用]    [http://www.geek521.c ...

  4. Spring中如何使用工厂模式实现程序解耦?

    目录 1. 啥是耦合.解耦? 2. jdbc程序进行解耦 3.传统dao.service.controller的程序耦合性 4.使用工厂模式实现解耦 5.工厂模式改进 6.结语 @ 1. 啥是耦合.解 ...

  5. JDK和Spring中的设计模式

    创建型 1)工厂方法 Collection.iterator() 由具体的聚集类来确定使用哪一个Iterator 2)单例模式 Runtime.getRuntime() 3)建造者模式 StringB ...

  6. 【设计模式】Java设计模式 - 模板模式

    Java设计模式 - 模板模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  7. [Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  8. [Head First设计模式]抢票中的设计模式——代理模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  9. [Head First设计模式]餐馆中的设计模式——命令模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  10. spring框架总结(04)----介绍的是Spring中的JDBC模板

    1.1  Jdbc模板概述 它是spring框架中提供的一个对象,是对原始Jdbc API对象的简单封装.spring框架为我们提供了很多的操作模板类,入下图所示: 我们今天的主角在spring-jd ...

随机推荐

  1. Java大浮点数精度

    BigDecimal 精度问题 BigDecimal舍入模式 ROUND_DOWN 向零舍入. 即1.55 变为 1.5 , -1.55 变为-1.5 ROUND_UP 向远离0的方向舍入 即 1.5 ...

  2. 7-35 jmu-python-求三角形面积及周长 (10 分)

    输入的三角形的三条边a.b.c,计算并输出面积和周长.假设输入三角形三边是合法整形数据. 三角形面积计算公式:  ,其中s=(a+b+c)/2. import math #导入math库 math.s ...

  3. 手机浏览器自动播放视频video(设置autoplay无效)的解决方案

    1.问题的提出 某一天接了个需求,需要在手机的H5页面内加入视频,我开开心心做完,准备交付的时候,问题来了,PM想要用户一进入页面,视频就开始播放,不需要用户手动点击. 2.尝试解决 加autopla ...

  4. Yoshino: 一个基于React的可定制化的PC组件库

    Github: https://github.com/Yoshino-UI... Docs: https://yoshino-ui.github.io/#/ Cli-Tool: https://git ...

  5. createjs的compositeOperation在Android和IOS上接受的参数居然不一样

    例如 目标.compositeOperation = 如果是安卓? "darken" : "darker";

  6. [LeetCode] 207. Course Schedule 课程表

    题目: 分析: 这是一道典型的拓扑排序问题.那么何为拓扑排序? 拓扑排序: 有三件事情A,B,C要完成,A随时可以完成,但B和C只有A完成之后才可完成,那么拓扑排序可以为A>B>C或A&g ...

  7. Oracle 11g rac中关于crsctl stop cluster/crs/has的区别

    转载至http://www.oracleplus.net/arch/1203.html,整理后得. 1 通过命令查看cluster/has/crs管理的内容 [root@11rac1 ~]# crsc ...

  8. MATLAB神经网络(2) BP神经网络的非线性系统建模——非线性函数拟合

    2.1 案例背景 在工程应用中经常会遇到一些复杂的非线性系统,这些系统状态方程复杂,难以用数学方法准确建模.在这种情况下,可以建立BP神经网络表达这些非线性系统.该方法把未知系统看成是一个黑箱,首先用 ...

  9. anconda添加镜像源

    # anaconda 安装镜像源 ***     在使用安装 conda 安装某些包会出现慢或安装失败问题,最有效方法是修改镜     像源为国内镜像源.     之前都选用清华镜像源,但是2019年 ...

  10. 启动崩盘!IDEA 2020 无法启动的解决办法|赠送 IDEA 2020 新功能

    今天早上看到 IDEA 可以升级新版本,想着体验一下新功能,点击升级,然后全部项目工程无法打开. 报错信息如下: Cannot execute command No project found to ...