Spring中有很多带template结尾的类,比如jdbcTemplate、hibernateTemplate等对数据库操作的类,它们就使用到了模板模式,但是spring并没有使用继承的方式来实现模板模式,而是采用组合的方式是的使用更加方便、更易于扩展。
先使用继承的方式模拟一下jdbcTemplate,伪代码如下:
//抽象模板类
public abstract class MyJdbcTemplate {
public void execute(String sql){
//获得连接
getConnection();
//对数据库的具体操作
doStatement(sql);
//释放资源
release();
}
public abstract void doStatement(String sql);
public void getConnection(){
}
public void release(){
}
}
只要子类继承该类,并且实现doStatement(String sql)方法,就可以实现对数据库的操作,获得连接和释放资源都将给模板来做,但是每次对对数据库的操作都需要继承,很麻烦。Spring的jdbcTemplate采用了组合和
回调函数。回调函数就是在方法参数中传递一个接口,调用方法时必须传递该接口的实现类。我们在使用代码来模拟一下:
//回调接口
public interface MyStatementCallBack {
Object doStatement(Statement stmt);
}
//模板类,不再是抽象类
public class MyJdbcTemplate {
//执行sql语句的模板
public Object execute(MyStatementCallBack action) throws Exception{
//获得连接
Connection conn = getConnection();
Statement stmt = conn.createStatement();
//执行数据库操作
Object obj = action.doStatement(stmt);
//释放连接
release();
return obj;
}
//获得连接
public Connection getConnection(){
return null;
}
//关闭资源
public void release(){
}
}
//调用execute方法
public static void main(String[] args)throws Exception {
MyJdbcTemplate mt = new MyJdbcTemplate();
//传入回调接口的实现类
mt.execute(new MyStatementCallBack() {
@Override
public Object doStatement(Statement stmt) {
//具体的实现...
return null;
}
});
}
相比之下,这种方式使用起来更加简洁。