標籤:ora replace wal fast car 開始 tle 穩定性 new
定義:
模板模式是一種行為設計模式,使用了JAVA的繼承機制,在抽象類別中定義一個模板方法,該方法引用了若干個抽象方法(由子類實現)或具體方法(子類可以覆蓋重寫)。它的實現思路是,建立一個樁方法,並且定義一些步驟讓子類來實現。模板方法定義了一個演算法的執行步驟,或者說能夠提供一種預設的實現,這種實現概括一部分子類或者全部子類的共同部分。
舉一個例子協助理解,假設提供一種造房子的演算法。演算法的步驟就是類比造房子的過程:建地基、建支撐,最後添加牆和窗戶 – 1. Fundation,2. Pillars,3. Walls,4. Windows。最重要的一點就是不能改變此建造過程,比如不可能在沒用地基的時候就開始建造窗戶。這個例子中,我們就建立了一個模板方法 – 將使用不同的方法完成對房子的建造。
為了確保子類不能重寫(override)這個模板方法,應當使用final。
模式中的角色
抽象模板:定義了一個模板方法和若干抽象方法和具體方法.
具體模板:繼承抽象模板類並實現抽象方法.
樣本:類比程式員的日常
抽象模板
package com.pichen.dp.behavioralpattern.templatemethod;public abstract class Day { public void getUp(){ System.out.println("get up~"); } public abstract void breakfast(); public abstract void goToWork(); public abstract void working(); public abstract void lunch(); public abstract void goHome(); public abstract void supper(); public void sleep(){ System.out.println("sleep~"); } //模板方法 public final void process(){ getUp(); breakfast(); goToWork(); working(); lunch(); working(); goHome(); supper(); sleep(); }}
具體模板
package com.pichen.dp.behavioralpattern.templatemethod;public class ProgrammerDay extends Day{ /** * @see com.pichen.dp.behavioralpattern.templatemethod.Day#breakfast() */ @Override public void breakfast() { System.out.println("breakfast:noodle~"); } /** * @see com.pichen.dp.behavioralpattern.templatemethod.Day#goToWork() */ @Override public void goToWork() { System.out.println("goToWork:drive car~"); } /** * @see com.pichen.dp.behavioralpattern.templatemethod.Day#working() */ @Override public void working() { System.out.println("working: coding~"); } /** * @see com.pichen.dp.behavioralpattern.templatemethod.Day#lunch() */ @Override public void lunch() { System.out.println("lunch: eat rice~"); } /** * @see com.pichen.dp.behavioralpattern.templatemethod.Day#goHome() */ @Override public void goHome() { System.out.println("goHome: walk~"); } /** * @see com.pichen.dp.behavioralpattern.templatemethod.Day#supper() */ @Override public void supper() { System.out.println("supper: rice~"); }}
用戶端
package com.pichen.dp.behavioralpattern.templatemethod;public class Main { public static void main(String[] args) { Day programmerDay = new ProgrammerDay(); programmerDay.process(); }}
結果
get up~breakfast:noodle~goToWork:drive car~working: coding~lunch: eat rice~working: coding~goHome: walk~supper: rice~sleep~
模版方法模式的結構
模版方法模式由一個抽象類別和一個(或一組)實作類別通過繼承結構組成,抽象類別中的方法分為三種:
- 抽象方法:父類中只聲明但不加以實現,而是定義好規範,然後由它的子類去實現。
- 模版方法:由抽象類別聲明並加以實現。一般來說,模版方法調用抽象方法來完成主要的邏輯功能,並且,模版方法大多會定義為final類型,指明主要的邏輯功能在子類中不能被重寫。
- 鉤子方法:由抽象類別聲明並加以實現。但是子類可以去擴充,子類可以通過擴充鉤子方法來影響模版方法的邏輯。
- 抽象類別的任務是搭建邏輯的架構,通常由經驗豐富的人員編寫,因為抽象類別的好壞直接決定了程式是否穩定性。
實作類別用來實現細節。抽象類別中的模版方法正是通過實作類別擴充的方法來完成商務邏輯。只要實作類別中的擴充方法通過了單元測試,在模版方法正確的前提下,整體功能一般不會出現大的錯誤。
優點
容易擴充。一般來說,抽象類別中的模版方法是不易反生改變的部分,而抽象方法是容易反生變化的部分,因此通過增加實作類別一般可以很容易實現功能的擴充,符合開閉原則。
便於維護。對於模版方法模式來說,正是由於他們的主要邏輯相同,才使用了模版方法,假如不使用模版方法,任由這些相同的代碼散亂的分布在不同的類中,維護起來是非常不方便的。
比較靈活。因為有鉤子方法,因此,子類的實現也可以影響父類中主邏輯的運行。但是,在靈活的同時,由於子類影響到了父類,違反了裡氏替換原則,也會給程式帶來風險。這就對抽象類別的設計有了更高的要求。
在多個子類擁有相同的方法,並且這些方法邏輯相同時,可以考慮使用模版方法模式。在程式的主架構相同,細節不同的場合下,也比較適合使用這種模式
Java設計模式--模板方法模式