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