模板模式
- 模板模式通常又被称为模板方法模式(Template Method Pattern),是指定义一个算法的骨架,并允许子类为一个或多个步骤提供实现。模板模式属于行为型设计模式。
- 模板模式使用场景:一次性实现一个算法不变的部分,并将可变的行为留给子类来实现;子类中公共的行为被提取出来,并集中到一个公共的父类,避免了代码的重复。
- 模板模式优点:提高代码的复用性和扩展性,符合开闭原则。
- 模板模式缺点:增加了类数目,间接的增加了系统类之间的复杂度,基于继承实现,所以父类添加抽象类方法,那么所有子类都需要修改。
代码示例
- 以JDBC操作为例,创建一个JdbcTemplate,封装所有的JDBC操作,现在以查询为例,先创建约束ORM逻辑的接口RowMapper:
public interface RowMapper<T> {
T mapRow(ResultSet rs, int rowNum);
}
- 所有的处理流程类JdbcTemplate:
public class JdbcTemplate {
private DataSource dataSource;
public JdbcTemplate(DataSource dataSource) {
this.dataSource = dataSource;
}
public List<?> executeQuery(String sql, RowMapper<?> rowMapper, Object[] args) {
try {
//1、获取连接
Connection conn = this.getConnection();
//2、创建语句集
PreparedStatement pstm = this.createPreparedStatement(conn, sql);
//3、执行语句集
ResultSet rs = this.executeSql(pstm, args);
//4、处理结果集
List<?> result = this.parseResultSet(rs, rowMapper);
//5、关闭结果集
this.closeResultSet(rs);
//6、关闭语句集
this.closeStatement(pstm);
//7、关闭连接
this.closeConnection(conn);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private void closeConnection(Connection conn) throws SQLException {
conn.close();
}
private void closeStatement(PreparedStatement pstm) throws SQLException {
pstm.close();
}
private void closeResultSet(ResultSet rs) throws SQLException {
rs.close();
}
private List<?> parseResultSet(ResultSet rs, RowMapper<?> rowMapper) throws SQLException {
List<Object> list = new ArrayList<>();
int rowNum = 1;
while(rs.next()) {
list.add(rowMapper.mapRow(rs, rowNum++));
}
return list;
}
private ResultSet executeSql(PreparedStatement pstm, Object[] args) throws SQLException {
for (int i = 0; i < args.length; i++) {
pstm.setObject(i, args[i]);
}
return pstm.executeQuery();
}
private PreparedStatement createPreparedStatement(Connection conn, String sql) throws SQLException {
return conn.prepareStatement(sql);
}
private Connection getConnection() throws SQLException {
return this.dataSource.getConnection();
}
}
- 创建user类:
@Getter
@Setter
public class User {
private String username;
private String password;
}
- 创建dao层:
public class UserDao extends JdbcTemplate{
public UserDao(DataSource dataSource) {
super(dataSource);
}
public List<?> selectAll() {
String sql = "select * from t_user";
return super.executeQuery(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) {
User user = new User();
user.setUsername("admin");
user.setUsername("123456");
return user;
}
},null);
}
}
- 定义测试代码:
public class test {
public static void main(String[] args) {
UserDao userDao = new UserDao(null);
List<?> list = userDao.selectAll();
System.out.println(list);
}
}
- UML类图如下图所示:
来源:CSDN
作者:junehozhao
链接:https://blog.csdn.net/baidu_37147070/article/details/103947038