定義:定義乙個操作中演算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變演算法的結構即可重定義該演算法中的某些特定步驟
型別:行為類模式
事實上,模板方法是程式設計中乙個經常用到的模式。比如,給定乙個整數陣列,把陣列中的數由大到小順序,然後把排序之後的結果列印出來。這個需求大體可以分為兩部分,排序和列印,列印功能好實現,排序優點麻煩。於是先把列印功能完成,排序功能另找別人做。
abstract class abstractsort
protected abstract void sort(int array);
public void showsortresult(int array)
}class concretesort extends abstractsort
protected void sort(int array)
}private void selectsort(int array, int index)
}temp = array[index]; // 交換量數值
array[index] = array[indexmin];
array[indexmin] = temp;
}以上就是模板方法模式。
模板方法模式的結構:
模板方法模式由乙個抽象類和乙個實現類通過繼承結構組成,抽象類中得方法分為三種:
1)抽象方法:父類中只宣告但不加以實現,而是定義好規範,然後由它的子類去實現
2)模板方法:由抽象類宣告並加以實現,一般來說,模板方法呼叫方法來完成主要的邏輯功能,並且,模板方法大多會定義為final型別,指明主要的邏輯功能在子類中不能被重寫。
3)鉤子方法:由抽象類宣告並加以實現。但是子類可以去擴充套件,子類可以通過擴充套件鉤子方法來影響模板方法的邏輯。
4)抽象類的任務是搭建邏輯的框架,通常由經驗豐富的人員編寫,因為抽象類的好壞直接決定了程式是否穩定性。
實現類用來實現細節。抽象類中的模板方法正式通過實現類擴充套件的方法來完成業務邏輯。只要實現類中的擴充套件方法通過了單元測試,在模板方法正確的前提下,整體功能一般不會出現大得錯誤。
模板方法的優點及適用場景:
容易擴充套件,一般來說,抽象類中的模板方法是不易發生改變的部分,而抽象方法是容易發生變化的部分,因為通過增加實現類一般可以很容易實現功能的擴充套件,符合開閉原則。
便於維護。對於模板方法模式來說,正式由於他們的主要邏輯相同,才使用了模板方法,假如不使用模板方法,任由這些相同的**散亂的分布在不同的類中,維護起來是非常不方便。
比較靈活。因為有鉤子方法,因此,子類的實現也可以影響父類中主邏輯的執行。但是,在靈活的同時,由於子類影響到了父類,違反了黎克特制替換原則,也會給程式帶來風險。這就對抽象類的設計有了更高的要求。
在多個子類擁有相同的方法,並且這些方法邏輯相同時,可以考慮使用模板方法模式。在程式的主框架相同,細節不同的場合下,也比較適合使用這種模式。
模板設計模式 PHP設計模式之模板方法模式
模板方法模式,也是我們經常會在不經意間有會用到的模式之一。這個模式是對繼承的最好詮釋。當子類中有重複的動作時,將他們提取出來,放在父類中進行統一的處理,這就是模板方法模式的最簡單通俗的解釋。就像我們平時做專案,每次的專案流程實都差不多,都有調研 開發 測試 部署上線等流程。而具體到每個專案中,這些流...
設計模式之模板方法設計模式
父類抽象出子類共有的方法,子類實現各自不同的業務。總之就是一種行為有他們共同的方法,只是他們具體的實現不一樣。比如開車這種行為模式,啟動 換擋 踩油門。每種型號品牌的車都有共同的行為,但是不同型號品牌的車的實現方式可能不同,需要每個品牌型號的車自己實現這些功能。這樣的定義上面行為的模式,稱之為模板方...
設計模式之模板方法模式
模板方法模式是類的行為模式。準備乙個抽象類,將部分邏輯以具體的方法以及具體建構函式的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實心這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模板方法的用意。模板方法模式需要開發抽象類和具體子類的設計師之間的協作。乙個設計...