一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
与策略模式比较:模板方法注重的是固定流程。策略模式注重的是某个流程用户的选择。
以查询为例:
1、定义一个模板:
public class JdbcTemplate {
private DataSource dataSource;
public JdbcTemplate(DataSource dataSource) {
this.dataSource = dataSource;
}
private Connection getConnection() throws Exception{
return this.dataSource.getConnection();
}
private PreparedStatement creatPreparedStatement(String sql,Connection connection)throws Exception{
return connection.prepareStatement(sql);
}
private List<?> parsetResultSet(ResultSet resultSet,RowMapper rowMapper) throws Exception{
List<Object> result = new ArrayList<Object>();
int rowNum = 0;
while (resultSet.next()){
result.add(rowMapper.mapRow(resultSet,rowNum++));
}
return result;
}
private ResultSet excutQuery(PreparedStatement preparedStatement,Object[] objects) throws Exception{
for (int i = 0; i < objects.length; i++) {
preparedStatement.setObject(i,objects[i]);
}
return preparedStatement.executeQuery();
}
private void closeStatement(Statement statement)throws Exception{
statement.close();
}
private void closeResult(ResultSet resultSet)throws Exception{
resultSet.close();
}
private void closeConnection(Connection connection)throws Exception{
//通常是放在连接池,不会关闭
}
public List<?> executQuery(String sql,RowMapper<?> rowMapper, Object[] values){
try{
//1、获取链接
Connection connection = this.getConnection();
//2、创建语句集
PreparedStatement statement = this.creatPreparedStatement(sql,connection);
//3、执行语句集,并获得结果集
ResultSet resultSet = this.excutQuery(statement,values);
//4、解析语句集
List<?> result = this.parsetResultSet(resultSet,rowMapper);
//5、关闭结果集
this.closeResult(resultSet);
//6、关闭语句集
this.closeStatement(statement);
//7、关闭链接
this.closeConnection(connection);
return result;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
}
2、查询结果的集合:
public class Member {
private String userName;
private String passWord;
private String nickName;
private int age;
private String addr;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
}
3、查询结果的的接口。
public interface RowMapper<T> {
public T mapRow(ResultSet rs,int rowNum) throws Exception;
}
4、Dao调用:
public class MemberDao {
private JdbcTemplate jdbcTemplate = new JdbcTemplate(null);
public MemberDao(DataSource dataSource) {
//super(dataSource);
}
public List<?> query(){
String sql = "select * from t_member";
return jdbcTemplate.executQuery(sql, new RowMapper<Member>() {
@Override
public Member mapRow(ResultSet resultSet, int rowNum) throws Exception {
Member member = new Member();
member.setUserName(resultSet.getString("username"));
member.setPassWord(resultSet.getString("password"));
member.setNickName(resultSet.getString("nickname"));
member.setAge(resultSet.getInt("age"));
member.setAddr(resultSet.getString("addr"));
return member;
}
},null);
}
}
5、测试:
public class App
{
public static void main( String[] args )
{
MemberDao memberDao = new MemberDao(null);
memberDao.query();
}
}