设计模式 - 模板方法模式
抽象父类定义算法的框架,而将一些实现步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- protected abstractMethod():基本方法,由子类实现
- public final templateMethod():模板方法,final标签防止修改(对外接口)
- protected hookMethod():钩子方法,子类复写该方法,通过其返回值,可改变模板方法的执行逻辑
模板方法模式优点:
- 封装不变部分,扩展可变部分
- 提取公共部分代码,便于维护(抽象是所有子类的共性封装)
- 父类做出行为规划,子类实现行为细节,子类可以通过钩子方法对行为规划做出一定调整。
general
// 抽象模板类
public abstract class AbstractModel {
// 抽象父类的基础方法可以提供默认实现
protected void step1(){System.out.println("father.step1");};
protected abstract void step3();
// 钩子方法,用于模板方法中控制处理逻辑
protected boolean needStep3(){
return true;
}
// 模板方法,final类型,固化了处理逻辑。
public final void execute(){
step1();
if(needStep3()){
step3();
}
}
}
// 具体子类,实现父类的抽象方法
public class Model extends AbstractModel{
private boolean needStep3 = true;
@Override
protected void step1() {System.out.println("son.step1");}
@Override
protected void step3() {System.out.println("step3");}
@Override
protected boolean needStep3(){
return needStep3;
}
// 将钩子方法的控制权限开放给调用方
public void setNeedStep3(boolean needStep3){
this.needStep3 = needStep3;
}
}
jdbcTemplate实例
// 抽象模板类 - 将jdbc创建链接 - 执行查询 - 关闭链接的代码提取成公共部分,由子类提供将结果集映射到对象的实现。
public abstract class JdbcTemplate<T> {
public final List<T> executeQuery(String sql, RowMapper<T> rowMapper, Object[] values){
Connection conn = this.getConnection(); // 1. 获取链接
PreparedStatement pstm = this.getPreparedStatement(conn, sql); // 2. 创建语句集
ResultSet rs = this.executeQuery(pstm, values); // 3. 执行语句集 - pstm.setObject(i, values[i]);
// 4. 处理结果集 -
List<T> result = this.parseResultSet(rs, rowMapper);
rs.close(); // 5. 关闭结果集
pstm.close(); // 6. 关闭语句集
conn.close(); // 7. 关闭链接
}
// 结果集到对象的映射方法。
protected List<T> parseResultSet(ResultSet rs, RowMapper<T> rowMapper) throws SQLException{
List<T> result = new ArrayList<>();
int rowNum = 0;
while (rs.next()){
result.add(rowMapper.mapRow(rs,rowNum++));
}
return result;
}
}
// 具体实现类
public class MemberDao<T> extends JdbcTemplate {
public List<T> selectAll(){
String sql = "select * from kiqi";
RowMapper rowMapper = (rs,i) ->{
try {
Member member = new Member();
member.setUsername(rs.getString("username"));
member.setPassword(rs.getString("password"));
return member;
}catch (SQLException e){
e.printStackTrace();
return null;
}
};
return super.executeQuery(sql, rowMapper,null);
}
}
欢迎疑问、期待评论、感谢指点 -- kiqi,愿同您为友
-- 星河有灿灿,愿与之辉