1.模版方法模式簡(jiǎn)介
模版方法模式(Template Method Pattern)是行為型(Behavioral)設(shè)計(jì)模式翻具,使用了Java的繼承機(jī)制,在抽象類里定義了模版方法,該模版方法調(diào)用了若干抽象方法(子類實(shí)現(xiàn))或具體方法(子類可覆蓋);并迫使子類實(shí)現(xiàn)抽象方法,從而實(shí)現(xiàn)其余的邏輯霜旧。
模版方法的用意在于,把相同的部分放在抽象基類中實(shí)現(xiàn)儡率,把變化的部分延遲到子類中實(shí)現(xiàn)挂据,不同的子類可以以不同的方式實(shí)現(xiàn)抽象方法,達(dá)到代碼復(fù)用的目的儿普。
模版方法模式一共有兩種角色:
AbstractClass(抽象類): 抽象類里定義了模版方法崎逃,模版方法定義了算法的框架(步驟),包括一系列基本操作眉孩;這些基本操作可以是抽象的(由子類實(shí)現(xiàn))个绍,也可以是具體的。
ConcreteClass(具體子類): 是抽象類的子類浪汪,用于實(shí)現(xiàn)在父類中聲明的抽象基本操作巴柿,也可以覆蓋父類中已經(jīng)實(shí)現(xiàn)的具體基本操作。
2. 模版方法模式舉例
當(dāng)使用JDBC操作數(shù)據(jù)庫(kù)的時(shí)候死遭,通常會(huì)有以下步驟:
- 加載驅(qū)動(dòng)
- 打開(kāi)連接
- 創(chuàng)建Statement
- 執(zhí)行SQL
- 關(guān)閉Statement和連接
每次對(duì)數(shù)據(jù)做操作相同的部分都有加載驅(qū)動(dòng)广恢、打開(kāi)連接、創(chuàng)建Statement呀潭、關(guān)閉Statement和連接钉迷,差別的部分僅在執(zhí)行SQL部分,因此非常適用于使用模版方法模式蜗侈。下面我們就根據(jù)這個(gè)場(chǎng)景篷牌,模擬舉例睡蟋。
序號(hào) | 類名 | 角色 | 說(shuō)明 |
---|---|---|---|
1 | AbstractTemplate | AbstractClass | 定義了模版方法的抽象類 |
2 | ConcreteTemplate | ConcreteClass | 具體子類踏幻,實(shí)現(xiàn)了父類的抽象方法 |
3 | TemplateMain | 客戶端 | 演示調(diào)用 |
AbstractTemplate類中的execute()就是模版方法,它定義了一個(gè)算法框架戳杀,包括了openConnection该面、doQuery、closeConnection等基本操作信卡,其中doQuery是抽象的隔缀。ConcreteTemplate繼承自AbstractTemplate,實(shí)現(xiàn)了doQuery方法傍菇。
1. 抽象模版類猾瘸。
/**
* 抽象模版類
*/
public abstract class AbstractTemplate {
private void openConnection(){
System.out.println("打開(kāi)連接");
}
// 模版方法
public final void execute(){
openConnection();
doQuery();
closeConnection();
}
// 抽象方法
protected abstract void doQuery();
private void closeConnection(){
System.out.println("關(guān)閉連接");
}
}
2.具體模版類
/**
* 具體模版類
*/
public class ConcreteTemplate extends AbstractTemplate {
protected void doQuery() {
System.out.println("執(zhí)行查詢");
}
}
3.演示調(diào)用
public class TemplateMain {
public static void main(String[] args) {
AbstractTemplate template = new ConcreteTemplate();
template.execute();
}
}
結(jié)果輸出:
打開(kāi)連接
執(zhí)行查詢
關(guān)閉連接
3. 總結(jié)
模版方法模式是一種通過(guò)類繼承的方式、實(shí)現(xiàn)代碼復(fù)用的技術(shù),把公共行為放在父類中牵触,而通過(guò)不同的子類來(lái)實(shí)現(xiàn)不同的行為淮悼。
除了JDBC操作數(shù)據(jù),在JMS或者M(jìn)Q的操作時(shí)揽思,同樣也可以用到模版方法袜腥。此外,Servlet中也有模版方法的影子钉汗,我們?cè)趯慡ervlet的時(shí)候羹令,通常都會(huì)繼承自HttpServlet,只需要覆蓋其doGet()和doPost()即可损痰;Servlet公共的行為都已經(jīng)在HttpServlet中實(shí)現(xiàn)了福侈。
(完)