1. 模板模式使用场景
模板模式是大家常见的设计模式之一,相信你早已使用过JdbcTemplate、RestTemplate等,很显然这就是模板模式的体现。
2. 代码实现
我们以封装数据库操作的JdbcTemplate为例。
public class JdbcTemplate {
private DataSource dataSource;
public JdbcTemplate(DataSource dataSource) {
this.dataSource = dataSource;
}
private Connection getConnection() throws SQLException {
return this.dataSource.getConnection();
}
private PreparedStatement createPreparedStatement(Connection conn, String sql) throws SQLException {
return conn.prepareStatement(sql);
}
private ResultSet executeQuery(PreparedStatement ps, RowMapper<?> rowMapper, Object[] values) throws SQLException {
for (int i = 0; i < values.length; i++) {
ps.setObject(i,values[i]);
}
return ps.executeQuery();
}
private void closeStatement(Statement st) throws Exception{
st.close();
}
private void closeResultSet(ResultSet rs) throws Exception{
rs.close();
}
private void closeConnection(Connection conn) throws Exception{
conn.close();
}
private List<Object> parseResultSet(ResultSet rs,RowMapper rowMapper) throws Exception{
List<Object> result = new ArrayList<Object>();
int rowNum = 1;
while (rs.next()){
result.add(rowMapper.mapRow(rs,rowNum ++));
}
return result;
}
public List<Object> executeQuery(String sql,RowMapper<?> row,Object [] values){
try {
// 1.获取连接
Connection conn = this.getConnection();
// 2.创建语句集
PreparedStatement ps = this.createPreparedStatement(conn,sql);
// 3.执行语句集,获取结果集
ResultSet res = ps.executeQuery();
// 4.解析语句集
List<Object> result = this.parseResultSet(res, null);
// 5.关闭结果集
this.closeResultSet(res);
// 6.关闭语句集
this.closeStatement(ps);
// 7.关闭连接
this.closeConnection(conn);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}
public interface RowMapper<T> {
public T mapRow(ResultSet rs, int rowNum) throws Exception;
}
public class Member {
private String username;
private String password;
private String nickName;
private int age;
private String addr;
//get&set略
}
//这里我们不进行继承JdbcTemplate类,原因是继承会重写很多方法
public class MemberDao{
private JdbcTemplate jdbc = new JdbcTemplate(null);
public List<Object> query(){
String sql = "SELECT * FORM member ";
return jdbc.executeQuery(sql,new RowMapper<Member>() {
public Member mapRow(ResultSet rs, int rowNum) throws Exception{
Member member = new Member();
member.setUsername(rs.getString("username"));
member.setPassword(rs.getString("password"));
member.setAge(rs.getInt("age"));
member.setAddr(rs.getString("addr"));
return member;
}
},null);
}
public Object processResult(ResultSet rs, int rowNum)throws Exception {
Member member = new Member();
member.setUsername(rs.getString("username"));
member.setPassword(rs.getString("password"));
member.setAge(rs.getInt("age"));
member.setAddr(rs.getString("addr"));
return member;
}
}
public class MemberDaoTest {
public static void main(String[] args) {
MemberDao memberDao = new MemberDao();
memberDao.query();
}
}
3. 总结
模板模式优点很明显,定义统一的执行标准,对于调用者不需要关系具体实现逻辑。它可以把公共的代码写在父类抽象类中,提高了代码的复用性,减少重复代码。父类进行行为管控,在子类中可以对父类方法进行扩展,具有扩展性,不同子类方法处理的灵活性。
模板模式的缺点是:由于继承关系父类的方法,子类都要重写一遍。