模板模式又叫模板方法模式(Template Method Pattern),指定义一个算法的骨架,并允许为一个或者多个步骤提供实现。模板模式使得子类可以在不改变算法结果的情况下,重新定义算法的某些步骤,属于行为型设计模式。模板模式适用于以下场景:
- 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。
spring 在*Template中用到了模板模式,但是spring并没有单纯的使用模板模式,而是使用了模板+callback模式来做的,这样增加了灵活性。
首先单纯用模板模式实现一个JDBCTemplate
public abstract class JdbcAbstractTemplate {
public final Object execute(){
System.out.println("连接数据库");
doInStatement("sql");
return "返回结果";
}
public abstract Object doInStatement(String res);
}
public class JDBCTemplate extends JdbcAbstractTemplate {
@Override
public Object doInStatement(String res) {
System.out.println("执行sql");
return null;
}
public static void main(String[] args) {
JDBCTemplate jdbc = new JDBCTemplate();
jdbc.execute();
}
}
执行结果为:
连接数据库
执行sql
然后我们看下spring在实现的时候是怎么做的(这里只是简单的做个实现,不喜勿喷)
public interface CallBack {
public Object doInStatement(String res);
}
public class JdbcTemplate {
public Object execute(CallBack callBack){
System.out.println("连接数据库");
callBack.doInStatement("sql");
return "返回结果";
}
}
public class Test {
public static void main(String[] args) {
JdbcTemplate jdbc = new JdbcTemplate();
jdbc.execute(new CallBack() {
@Override
public Object doInStatement(String res) {
System.out.println("执行sql:"+res);
return null;
}
});
}
}
执行结果为:
连接数据库
执行sql:sql
这样就灵活了很多…
源码地址:https://gitee.com/xj-louge/pattern.git