设计模式十:模板模式

会有一股神秘感。 提交于 2020-01-13 00:52:10

模板模式

  • 模板模式通常又被称为模板方法模式(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类图如下图所示:
    在这里插入图片描述
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!