定義一個操做中的算法的骨架,而將一些步驟延遲到子類中。算法
重點不是選擇,只能 重定義 該算法的某些特定的步驟。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
模版模式,其實就是定義一整套固定流程,其中特定流程能夠 個性化。
=====================================
參考資料:
咕泡學院
《大話設計模式》
《設計模式之蟬》