Posted on 2007-11-28 20:36
flustar 閱讀(983)
評論(0) 編輯 收藏 所屬分類:
Design Patterns
《設計模式》一書對Template Method模式是這樣描述的:
定義一個操作中算法的骨架,而將一些步驟延遲到子類中。不改變算法的結構而重新定義它的步驟。
我的理解:定義一個抽象類或者說接口,在它的內部定義一些抽象的方法(供TemplateMethod調用的步驟)和一個TemplateMethod方法(非抽象方法),封裝了這些抽象方法的接口或抽象類就是骨架。而將它的實現延遲到子類中,也就是用子類實現它。不改變算法的結構而重新定義它的步驟,也就是改寫或者實現父類的這些非TemplateMethod的抽象方法。下面給出一個例子:
abstract class QueryTemplate{
public void doQuery(){ //Template Method
formatConnect();
formatSelect();
}
protected abstract void formatConnect();
protected abstract void formatSelect();
}
class OracleQT extends QueryTemplate{
public void formatConnect() {
System.out.println("格式化Qracle數據庫連接");
}
public void formatSelect() {
System.out.println("格式化Oracle數據庫查詢");
}
}
class MysqlQT extends QueryTemplate{
public void formatConnect() {
System.out.println("格式化Mysql數據庫連接");
}
public void formatSelect() {
System.out.println("格式化Mysql數據庫查詢");
}
}
public class client {
public static void main(String[] args) {
QueryTemplate oracleQT=new OracleQT();
oracleQT.doQuery();
QueryTemplate mysqlQT=new MysqlQT();
mysqlQT.doQuery();
}
}
輸出結果:
格式化Qracle數據庫連接
格式化Oracle數據庫查詢
格式化Mysql數據庫連接
格式化Mysql數據庫查詢
在這個例子中,我們定義了一個骨架QueryTemplate,在它的內部定義了一個Template Method,和一些步驟(抽象方法),使用Template Method來調用這些步驟。步驟是在子類中實現的。
小結:有時候,會遇到由一系列步驟構成的過程需要執行。這個過程從高層次上看是相同的,但有些步驟的實現可能不同。正如,查詢SQL數據庫從高層次上看過程是相同的,但某些細節比如如何連接數據庫則可能因平臺等細節的不同而不同。通過Template Method模式,我們可以先定義步驟序列,然后覆蓋那些需要改變的步驟。