1. 程式人生 > >java設計模式--模板方法

java設計模式--模板方法

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)、模板方法使用繼承方式複用程式碼,如果要在基本演算法裡面增加一個步驟,而該步驟是抽象的話,每個子類都要修改程式碼,實現這個步驟。