java設計模式--模板方法
阿新 • • 發佈:2018-12-31
1.模板方法定義
模板方法模式在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。
2.模板方法的類圖
如圖,一個簡單的汽車例項。例項的程式碼如下:
定義一個汽車抽象模型的類。
public abstract class CarModel { public abstract void start(); //發動 public abstract void stop(); //停止 public abstract void alarm(); //轟鳴 public abstract void engineBoom(); /*如果定義成抽象類,子類繼承中要實現方法。每個汽車都要同樣的執行方法.程式碼重複, 所以定義在抽象類中非抽象方法。 */ final public void run(){ //用final修飾防止子類進行更改。 this.start(); this.stop(); this.alarm(); this.engineBoom(); }; }
用兩個具體的汽車來繼承汽車模型,程式碼如下:
public class Car1 extends CarModel{ public void start() { System.out.println("H1啟動"); } public void stop() { System.out.println("H1停止"); } public void alarm() { System.out.println("H1鳴笛"); } public void engineBoom() { System.out.println("H1發動機轟鳴"); } } public class Car2 extends CarModel{ public void start() { System.out.println("H2啟動"); } public void stop() { System.out.println("H2停止"); } public void alarm() { System.out.println("H2鳴笛"); } public void engineBoom() { System.out.println("H2發動機轟鳴"); } } public static void main(String[] args) throws IOException { Car1 c1 = new Car1(); c1.run(); } H1啟動 H1停止 H1鳴笛 H1發動機轟鳴
用測試類測試下,可以直接拿來用,這就是一個簡單的模板方法。
3.模板方法典型的應用例項
public class JDBCDemo5 { public static void main(String[] args) { Connection conn = null; try { conn = DBUtil.getConnection(); Statement state = conn.createStatement(); String sql = "SELECT id,username,password,email,account " + "FROM userinfo_fancq"; ResultSet rs = state.executeQuery(sql); /* * 通過結果集獲取元資料 */ ResultSetMetaData rsmd = rs.getMetaData(); /* * 通過元資料檢視結果集中總共有多少個欄位? */ int colCount = rsmd.getColumnCount(); for(int i=1;i<=colCount;i++){ String colName = rsmd.getColumnName(i); System.out.println(colName); } } catch (Exception e) { e.printStackTrace(); } finally{ if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
上面的典型案例分析:
1. 獲取資料庫連線(不可變)
2. 執行sql語句(不可變)
3. 查詢出來的欄位(根據sql語句可變)
4. 處理異常(不可變)
5. 關閉連線釋放資源(不可變)
用模板方式的程式碼結構如下:
public abstract class JdbcTemplate {
private Connection con;
private Statement state;
@Autowired
private DataSource dataSource;
private ResultSet resultSet;
private ResultSetMetaData data;
public void getStatement(String sql) throws SQLException{
con = dataSource.getConnection();
state = con.createStatement();
resultSet = state.executeQuery(sql);
}
private void releaseResources() throws SQLException {
if (resultSet != null)
resultSet.close();
if (state != null)
state.close();
if (con != null)
con.close();
}
protected abstract void getColumn(ResultSet resultSet) throws SQLException;
public final void getOperation(String sql)throws SQLException{
getStatement(sql);
releaseResources();
getColumn(resultSet);
}
}
public class JdbcCreateEntity extends JdbcTemplate{
@Override
protected void getColumn(ResultSet resultSet) throws SQLException {
/*
* 通過結果集獲取元資料
*/
ResultSetMetaData rsmd = resultSet.getMetaData();
/*
* 通過元資料檢視結果集中總共有多少個欄位?
*/
int colCount = rsmd.getColumnCount();
for(int i=1;i<=colCount;i++){
String colName = rsmd.getColumnName(i);
System.out.println(colName);
}
}
}
jdbc一個簡單的模板模式。僅供方便理解。
4.模板方法的優點和缺點
1、優點
(1)、演算法只存在於一個地方,也就是在父類中,容易修改。需要修改演算法時,只要修改父類的模板方法或者已經實現的某些步驟,子類就會繼承這些修改。
(2)、實現了最大化程式碼複用。父類的模板方法和已實現的某些步驟會被子類繼承而直接使用。
(3)、既統一了演算法,也提供了很大的靈活性。父類的模板方法確保了演算法的結構保持不變,同時由子類提供部分步驟的實現。
(4)、提供了一個基本框架,容易擴充套件子類。模板方法有框架控制如何做事情,而由使用框架的人指定框架演算法中每個步驟的細節。子類只要繼承父類,實現抽象方法,就可以使用父類的演算法。
2、缺點
(1)、模板方法使用繼承方式複用程式碼,如果要在基本演算法裡面增加一個步驟,而該步驟是抽象的話,每個子類都要修改程式碼,實現這個步驟。