設計模式七 模版模式

0、基本定義

定義一個操做中的算法的骨架,而將一些步驟延遲到子類中。算法

重點不是選擇,只能 重定義 該算法的某些特定的步驟。sql

 

這裏場景模擬 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 createPreparedStatment(Connection con, String sql) throws SQLException {
        return con.prepareStatement(sql);
    }

    private ResultSet executeQuery(PreparedStatement stmt, Object[] values) throws SQLException {
        for (int i = 0; i < values.length; i++) {

            stmt.setObject(i, values[i]);
        }
        return stmt.executeQuery();
    }

    private void closeStatment(Statement stmt) throws SQLException {
        stmt.close();
    }

    private void closeResult(ResultSet rs) throws SQLException {
        rs.close();
    }

    private void closeConnection(Connection con) throws SQLException {
        con.close();
    }


    private List<?> parseResultSet(ResultSet rs, RowMapper rowMapper) throws Exception {
        List result = new ArrayList();
        int rowNum = 1;
        while (rs.next()) {

            result.add(rowMapper.mapRow(rs, rowNum++));
        }
        return result;
    }


    public List<?> executeQuery(String sql, RowMapper<?> rowMapper, Object[] values) throws Exception {

        //一、獲取連接
        Connection connection = getConnection();//dataSource.getConnection();

        //二、建立語句集
        PreparedStatement pstmt = createPreparedStatment(connection, sql);//connection.prepareStatement(sql);

        //三、執行語句集、而且得到結果集
        ResultSet rs = executeQuery(pstmt, null);//pstmt.executeQuery();

        //四、解析語句集
        List<?> result = parseResultSet(rs, rowMapper);
//        List result = new ArrayList();
//        int rowNum = 1;
//        while (rs.next()) {
//
//            result.add(processResult(rs, rowNum));
//        }

        //五、關閉結果集
        this.closeStatment(pstmt);
        //六、關閉語句集
        this.closeResult(rs);
        //七、關閉連接
        this.closeConnection(connection);

        return result;
    }

//    public abstract Object processResult(ResultSet rs, int rowNum) throws SQLException;
}



public class MemberDao  {

    //不繼承,爲了 解耦
    private JdbcTemplate jdbcTemplate = new JdbcTemplate(null);

    public List query() throws Exception {
        String sql = "select * from t_member";
        return jdbcTemplate.executeQuery(sql, new RowMapper<Member>() {

            //用戶 寫的地方
            @Override
            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"));
                return member;
            }
        }, null);
    }

//    @Override
//    public Object processResult(ResultSet rs, int rowNum) throws SQLException {
//        Member member = new Member();
//        member.setUsername(rs.getString("username"));
//        member.setPassword(rs.getString("password"));
//        member.setAge(rs.getInt("age"));
//        return member;
//    }
}


@Data
public class Member {

    private String username;
    private String password;
    private String nickname;

    private int age;
}

public interface RowMapper<T> {

    public T mapRow(ResultSet rs,int rowNum) throws Exception;
}

 

二、總結

優勢:app

》封裝不變部分(父類),擴展可變部分(子類)ide

》提取公共部分代碼,方便維護this

 

策略模式 vs 模版模式spa

策略模式: 重在選擇設計

模版模式: 側重點不是選擇,只能 參與 其中一部分的 自定義,個性化code

 

====================================blog

模版模式,其實就是定義一整套固定流程,其中特定流程能夠 個性化。

=====================================

參考資料:

咕泡學院

《大話設計模式》

《設計模式之蟬》

相關文章
相關標籤/搜索