定义: 定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。
模板去定义动作,子类或使用的类去执行特定的操作。
模板方法的两种实现方式:
1. 在父类中定义方法,子类根据自己的需要去实现具体的方法。(参照:httpServlet)
2. 定义一个模板类,去执行各种动作,暴露回调函数让调用者去执行具体步骤。
使用场景:
用于重构同种类型的重复代码。把重复代码抽到模板中,不同的部分在回调中具体实现。
好处:重构代码,增加代码的复用性。
下面实现一个简单的DbTemlate
/**
* 模板类
* @author jiangwei
*
*/
public class DbTemplate {
/**
* 查询
* @param <T>
* @param clazz
* @param sql
* @param callBack
* @return
*/
public static <T> T getModel(Class<T> clazz, String sql, CallBack<T> callBack) {
Connection conn = null;
PreparedStatement st = null;
T t = null;
try {
conn = null; //TODO
st = conn.prepareStatement(sql);
callBack.setParameter(st);
ResultSet rs = st.executeQuery();
while(rs.next())
{
t = callBack.setBean(rs);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return t;
}
}
/**
* 回调类
* @author jiangwei
*
* @param <T>
*/
public interface CallBack<T> {
/**
* 设置参数
* @param st
*/
void setParameter(PreparedStatement st);
/**
* 装载bean
* @param rs
* @return
*/
T setBean(ResultSet rs);
}