java学习之路:浅谈template和callback模式,结合简单分析Spring 的jdbctemplate源码

1.callback

这个在很多语言中都有出现,例如js中的回调函数

说白了就是:调用一个方法,参数中需要传入一个方法,该方法会调用的时候会使用到用户传入的方法

2.template模板模式

  1. 将一个功能(算法)的实现逻辑的骨架取出

2.定义一个抽象类将这些实现逻辑的骨架抽取成一个个抽象方法.公共的部分可以使用默认实现方法,然后定义一个(final修饰不可改)方法依次将这些方法放进去,达到调用这个方法即可实现一个功能的目的

3.此时该抽象类为一个功能的骨架模板

4.不同的子类实现该骨架模板,并实现其中的抽象方法,各自调用默认实现功能的方法即实现拥有相同算法逻辑但是有不同功能的方法

总的来说就是:定义一个功能模板,继承的子类必须按照它的算法逻辑.但是具体的不同的实现逻辑由子类进行决定

3.Spring中的template例子:

例如JDBCtemplate ,执行一个sql语句的大概逻辑为:贾琏欲执事

1.加载数据驱动

2.连接数据库

3.创建预编译语句

4.执行sql语句

5.释放资源

sql语句分为增删查改 四种

问题1

如何没有使用模板设计模式我们需要将4个执行的方法逻辑完全的写在4个不同的方法中,每一个方法都需要写这5个步骤,但是其中的额125步骤是重复的,出现重复代码的情况

使用template模板设计模式

1.我们将这5个步骤抽取出来放在一个抽象类中,其中12为一个默认实现的方法.5也是一个默认实现的方法,而其中的34需要根据我们不同的实际使用情况而不同,所以定义一个抽象方法

2.再定义一个final修饰的执行贾琏欲执事的方法excute();

3.此时创建出4个子类分别继承该模板父类,实现34步骤sql()方法,调用excute()方法即可,此时125重复代码即消除完毕

问题2

创建4个子类颇为麻烦,如果类似34步骤需要实现的方法再多一点,就会显得很笨重

解决

使用callback模式:回调函数

1.将34步骤的抽象方法改成一个内部类(接口)Callback,接口中定义一个抽象方法为sql()

2.excute()方法中改成excute(Callback callback) 本来执行34步骤的方法sql()改成 接口实现对象Callback调用实现方法:callback.sql(),

3.此时用户直接可以使用模板的excute方法,用户使用回调函数,在参数中直接定义一个匿名内部类,实现其中的sql方法即可,可以根据增删查改来自己定义其中的逻辑,不需要实现4个子类这么麻烦

优化

由于实现sql()定义的逻辑中可以分为query和update ,所以我们可以帮用户定义好这两个逻辑的方法,用户只需要调用根据需求调用这两个方法,参数为对应的sql语句

此时JDBCtemplate的源码即简单解释完毕了!!!

下面上源码!

1.模板的功能方法

JmsTemplate的使用_spring


2.具体的query方法,我们帮用户进行回调,用户只需要传入需要的sql和rse参数即可

JmsTemplate的使用_JmsTemplate的使用_02

3.源码中的callback接口是不是内部接口,而是单独设计出一个类

JmsTemplate的使用_设计模式_03