在物件導向開發過程中,通常會遇到這樣乙個問題,我們知道乙個演算法所需的關鍵步驟,並確定了這些步驟的執行順序,但是,某些步驟的具體實現是未知的,或者說某些步驟的實現是會隨著環境的變化而改變,例如,執行程式的流程大致如下:(1) 檢查**的正確性
(2)鏈結相關的類庫
(3)編譯相關的**
(4)執行程式
對於不同的程式語言,上述4個步驟都是不一樣的,但是,它們的執行流程是固定的,這類問題的解決方案就是我們本篇要將的模版方法模式。
在定義乙個操作中的演算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。
(1)多個子類有公有的方法,並且邏輯基本相同時(2)重要,複雜的演算法,可以把核心演算法設計為模板方法,周邊的相關細節功能則由各個子類實現
(3)重構時,模板方法模式是乙個經常使用的模式,把相同的**抽取到父類中,然後通過鉤子函式約束其行為。
模版方法模式實際上是封裝乙個固定流程,就像是一套執行模板一樣,第一步該做什麼,第二步該做什麼都已經在抽象中定義好。而子類可以有不同的演算法實現,在框架不被修改的情況下實現某些步驟的演算法替換,下面以開啟計算機這個動作來簡單演示一下模板方法。開啟計算機的整個流程都是相對固定的,首先啟動計算機電源,計算機檢測自身狀態沒有問題時將進入作業系統,對使用者進行驗證之後即可登入計算機,下面我們使用模板方法來模擬一下這個過程:
//抽象的computer
public
abstract
class
abstractcomputer
protected
void
checkhardware()
protected
void
loados()
protected
void
login()
//啟動計算機方法後,步驟固定為開啟電源,系統檢查,載入作業系統,使用者登入。該方法為finish,防止演算法框架被覆寫
public
final
void
startup()
}//程式設計師的計算機
public
class
codercomputer
extends
abstractcomputer
}//軍用計算機
public
class
militarycomputer
extends
abstractcomputer
@override
protected
void
login()
}//測試**
publi void test
}
輸出結果如下
—-開機 start —-開啟電源
硬體檢查
載入作業系統
程式設計師只需要使用者和密碼驗證就可以了
—— 開機 end —–
—— 關機 start ——
開啟電源
硬體檢查
檢查硬體防火牆
載入作業系統
進行指紋識別等複雜的使用者驗證
—— 關機 end ——
通過上面的例子可以看到,在startup方法中有一些固定的步驟,一次為啟動電源,檢查硬體,載入系統,使用者登入4個步驟,這4個步驟是計算機開機過程中不會變動的。但是不同的使用者實現起來可能各不相同,因此,子類需要覆寫相應的方法來進行自定義處理,這裡需要注意的是startup為final方法,這樣就保證了邏輯流程不會被子類修改,子類只能改變某一步驟中的具體實現,這樣就保證了這個邏輯流程的穩定性。startup中的幾個演算法步驟我們稱之為是乙個套路,也稱為模板方法,這也是該模版的由來。
模板方法模式 設計模式系列
模板方法模式 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定的步驟。定義有些呆板,說說我的理解吧。父類定義實施的步驟,子類中實現具體的演算法。當我們要完成在某一細節層次一直得乙個過程或一系列步驟,但其個別步驟在更詳細的層...
Swift 重學設計模式系列之模板方法模式
模板方法 template method 模式的定義如下 定義乙個操作中的演算法骨架,而將演算法的一些步驟延遲到子類中,使得子類可以不改變該演算法結構的情況下重定義該演算法的某些特定步驟。它是一種類行為型模式。該模式的主要優點如下。1.它封裝了不變部分,擴充套件可變部分。它把認為是不變部分的演算法封...
Android設計模式系列 模板方法模式
2013 11 26 17 15 佚名 字型大小 t t 我個人對模板方法的經典思想特別推崇,雖然模板方法在大對數情況下並不被推薦使用,但是這種通過父類呼叫子類的方法,使用繼承來改變演算法的一部分,是物件導向的一種基本認識。模板方法,和單例模式是我認為gof的23中最簡單的兩種模式。但是我個人對模板...