美文网首页
模板模式实战

模板模式实战

作者: 奋斗的韭菜汪 | 来源:发表于2020-06-29 21:55 被阅读0次

    定义:是指定义一个算法的骨架,并允许子类为其中一个或者多个步骤提供实现。
    模板模式使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤
    (重新定义算法可以实现钩子功能)
    适用场景:1、一次性实现一个算法不变的部分,并将可变的行为留给子类来实现。
    2、各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复
    实例:实例中结果集是用户可以参与定义的

    import javax.sql.DataSource;
    import java.sql.*;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 模板模式(模板方法模式):有点类似于策略模式,策略模式只有选择权(由用户自己选择已有的固定算法),
     * 模板模式侧重的点不是选择,你没得选择,你必须这么做,你可以参与某一部分自定义,
     * 整个执行流程固定(例如用户购物,必须是先加入购物车,下单,结算,支付这一套流程),但是用户可以参与
     * 其中部分的的过程,结果不固定
     */
    public class JdbcTempate {
    
        private DataSource dataSource;
    
        public JdbcTempate(DataSource dataSource){
            this.dataSource = dataSource;
        }
    
    
        private Connection getConnection() throws  Exception{
            return this.dataSource.getConnection();
        }
    
        private PreparedStatement createPreparedStatement(Connection conn, String sql) throws Exception{
            return conn.prepareStatement(sql);
        }
    
        private ResultSet executeQuery(PreparedStatement pstmt, Object[] values) throws Exception{
            for(int j = 0; j < values.length; j++){
                pstmt.setObject(j, values[j]);
            }
            return pstmt.executeQuery();
    
        }
    
        private void closeStatment(Statement stmt) throws Exception{
    
            stmt.close();
        }
    
        private void closeResult(ResultSet rs) throws Exception{
    
            rs.close();
        }
    
        private void closeConnection(Connection conn) throws Exception{
            //通常是不关的,而是放回连接池中
            //conn.close();
        }
    
        private List<?> parseResultSet(ResultSet rs, RowMapper rowMapper) throws Exception{
            //返回结果集
            List<Object> result = new ArrayList<>();
            int rowNum = 1;
                while (rs.next()){
                    result.add(rowMapper.mapperRow(rs, rowNum));
                }
            return result;
        }
    
        public List<?> executeQuery(String sql,RowMapper<?> rowMapper, Object[] values){
            //注册驱动]
    
            try {
                //获取连接
                Connection conn = this.getConnection();
    
                //创建sql对象
                PreparedStatement preparedStatement = this.createPreparedStatement(conn, sql);
    
                //执行sql
    
                ResultSet rs = this.executeQuery(preparedStatement, values);
    
                //解析语句集
                List<?> result = this.parseResultSet(rs, rowMapper);
    
                //关闭连接
                this.closeResult(rs);
    
                this.closeStatment(preparedStatement);
    
                this.closeConnection(conn);
    
                return result;
            } catch (Exception e) {
                e.printStackTrace();
            }
          return null;
        }
    
        //public abstract Object processResult(ResultSet rs, int rowNum) throws Exception;
    
    }
    
    public class MemberDao {
    
        private JdbcTempate JdbcTempate = new JdbcTempate(null);
    
        public  List<?> query(){
            String sql = "select * from Member";
    
            //接口实现代替集成抽象类,解耦
            //匿名实现
            return JdbcTempate.executeQuery(sql, new RowMapper<MemberEntity>() {
    
                @Override
                public MemberEntity mapperRow(ResultSet rs, int rowNum) throws Exception {
                    MemberEntity memberEntity = new MemberEntity();
                    memberEntity.setUsername(rs.getString("username"));
                    memberEntity.setAge(rs.getInt("age"));
                    memberEntity.setPassword(rs.getString("password"));
                    memberEntity.setNickname(rs.getString("nickname"));
                    return memberEntity;
                }
            },null);
        }
    //    @Override
    //    public Object processResult(ResultSet rs, int rowNum) throws Exception{
    
    //    }
    }
    
    
    public class MemberEntity {
    
        private String username;
    
        private String password;
    
        private String nickname;
    
        private int age;
    
        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;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    
    public interface RowMapper<T> {
    
        T mapperRow(ResultSet rs, int rowNum) throws Exception;
    }
    
    public class MemberDaoTest {
    
        public static void main(String[] args) {
            MemberDao memberDao = new MemberDao();
            memberDao.query();
        }
    }
    

    相关文章

      网友评论

          本文标题:模板模式实战

          本文链接:https://www.haomeiwen.com/subject/hyaafktx.html