設計模式系列之模板方法模式

模板方法模式介紹

在面向對象開發過程中,通常會遇到這樣一個問題,我們知道一個算法所需的關鍵步驟,並確定了這些步驟的執行順序,但是,某些步驟的具體實現是未知的,或者說某些步驟的實現是會隨着環境的變化而改變,例如,執行程序的流程大致如下:
(1) 檢查代碼的正確性
(2)鏈接相關的類庫
(3)編譯相關的代碼
(4)執行程序
對於不同的程序設計語言,上述4個步驟都是不一樣的,但是,它們的執行流程是固定的,這類問題的解決方案就是我們本篇要將的模版方法模式。

模板方法模式的定義

在定義一個操作中的算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

模板方法模式的使用場景

(1)多個子類有公有的方法,並且邏輯基本相同時
(2)重要,複雜的算法,可以把核心算法設計爲模板方法,周邊的相關細節功能則由各個子類實現
(3)重構時,模板方法模式是一個經常使用的模式,把相同的代碼抽取到父類中,然後通過鉤子函數約束其行爲。

模板方法模式的簡單示例

模版方法模式實際上是封裝一個固定流程,就像是一套執行模板一樣,第一步該做什麼,第二步該做什麼都已經在抽象中定義好。而子類可以有不同的算法實現,在框架不被修改的情況下實現某些步驟的算法替換,下面以打開計算機這個動作來簡單演示一下模板方法。打開計算機的整個流程都是相對固定的,首先啓動計算機電源,計算機檢測自身狀態沒有問題時將進入操作系統,對用戶進行驗證之後即可登錄計算機,下面我們使用模板方法來模擬一下這個過程:

//抽象的Computer
public abstract class AbstractComputer{

protected void powerOn(){
System.out.println("開啓電源");
}

protected void checkHardware(){
System.out.println("硬件檢查");
}

protected void loadOS(){
System.out.println("載入操作系統");
}

protected void login(){
System.out.println("小李的計算機無法驗證,直接進入系統");
}

//啓動計算機方法後,步驟固定爲開啓電源,系統檢查,加載操作系統,用戶登錄。該方法爲finish,防止算法框架被覆寫
public final void startup(){
System.out.println("-----關機 START------");
powerOn();
checkHardware();
loadOS();
login();
System.out.println("------關機END------");
}
}
//程序員的計算機
public class CoderComputer extends AbstractComputer{
@Override
protected void login(){
System.out.println("程序員只需要進行用戶和密碼驗證就可以了");
}
}

//軍用計算機
public class militaryComputer extends AbstractComputer{
@Override
protected void checkHardware(){
super.checkHardware();
System.out.println("檢查硬件防火牆");
}
@Override
protected void login(){
System.out.println("進行指紋識別等複雜的用戶驗證");
}
}

//測試代碼
publi void Test{
public static void main(String[] args){
AbstractComputer comp=new CodeComputer();
comp.startUp();

comp=new MilitaryComputer();
comp.startUp();
}
} 

輸出結果如下

—-開機 START —-
開啓電源
硬件檢查
載入操作系統
程序員只需要用戶和密碼驗證就可以了
—— 開機 END —–
—— 關機 START ——
開啓電源
硬件檢查
檢查硬件防火牆
載入操作系統
進行指紋識別等複雜的用戶驗證
—— 關機 END ——

總結

通過上面的例子可以看到,在startUp方法中有一些固定的步驟,一次爲啓動電源,檢查硬件,加載系統,用戶登錄4個步驟,這4個步驟是計算機開機過程中不會變動的。但是不同的用戶實現起來可能各不相同,因此,子類需要覆寫相應的方法來進行自定義處理,這裏需要注意的是startUp爲final方法,這樣就保證了邏輯流程不會被子類修改,子類只能改變某一步驟中的具體實現,這樣就保證了這個邏輯流程的穩定性。startUp中的幾個算法步驟我們稱之爲是一個套路,也稱爲模板方法,這也是該模版的由來。

發佈了100 篇原創文章 · 獲贊 93 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章