23種設計模式(6) 模版方法模式

2021-06-05 09:28:05 字數 1552 閱讀 8355

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

型別:行為類模式

類圖:

事實上,模版方法是程式設計中乙個經常用到的模式。先來看乙個例子,某日,程式設計師a拿到乙個任務:給定乙個整數陣列,把陣列中的數由小到大排序,然後把排序之後的結果列印出來。經過分析之後,這個任務大體上可分為兩部分,排序和列印,列印功能好實現,排序就有點麻煩了。但是a有辦法,先把列印功能完成,排序功能另找人做。

abstract class abstractsort 

}}

寫完後,a找到剛畢業入職不久的同事b說:有個任務,主要邏輯我已經寫好了,你把剩下的邏輯實現一下吧。於是把abstractsort類給b,讓b寫實現。b拿過來一看,太簡單了,10分鐘搞定,**如下:

class concretesort extends abstractsort ; // 預設資料陣列

public static void main(string args)

}

執行結果:排序結果:  0  1  3  4  5  7  9 10 12 32

執行正常。行了,任務完成。沒錯,這就是模版方法模式。大部分剛步入職場的畢業生應該都有類似b的經歷。乙個複雜的任務,由公司中的牛人們將主要的邏輯寫好,然後把那些看上去比較簡單的方法寫成抽象的,交給其他的同事去開發。這種分工方式在程式設計人員水平層次比較明顯的公司中經常用到。比如乙個專案組,有架構師,高階工程師,初級工程師,則一般由架構師使用大量的介面、抽象類將整個系統的邏輯串起來,實現的編碼則根據難度的不同分別交給高階工程師和初級工程師來完成。怎麼樣,是不是用到過模版方法模式?

模版方法模式的結構

模版方法模式由乙個抽象類和乙個(或一組)實現類通過繼承結構組成,抽象類中的方法分為三種:

實現類用來實現細節。抽象類中的模版方法正是通過實現類擴充套件的方法來完成業務邏輯。只要實現類中的擴充套件方法通過了單元測試,在模版方法正確的前提下,整體功能一般不會出現大的錯誤。

模版方法的優點及適用場景

容易擴充套件。一般來說,抽象類中的模版方法是不易反生改變的部分,而抽象方法是容易反生變化的部分,因此通過增加實現類一般可以很容易實現功能的擴充套件,符合開閉原則。

便於維護。對於模版方法模式來說,正是由於他們的主要邏輯相同,才使用了模版方法,假如不使用模版方法,任由這些相同的**散亂的分布在不同的類中,維護起來是非常不方便的。

比較靈活。因為有鉤子方法,因此,子類的實現也可以影響父類中主邏輯的執行。但是,在靈活的同時,由於子類影響到了父類,違反了黎克特制替換原則,也會給程式帶來風險。這就對抽象類的設計有了更高的要求。

在多個子類擁有相同的方法,並且這些方法邏輯相同時,可以考慮使用模版方法模式。在程式的主框架相同,細節不同的場合下,也比較適合使用這種模式。

23種設計模式(6) 模版方法模式

定義 定義乙個操作中演算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變演算法的結構即可重定義該演算法中的某些特定步驟。型別 行為類模式 類圖 事實上,模版方法是程式設計中乙個經常用到的模式。先來看乙個例子,某日,程式設計師a拿到乙個任務 給定乙個整數陣列,把陣列中的數由小到大排序,然後把排序...

23種設計模式(12) 模版方法模式

定義 定義乙個操作中演算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變演算法的結構即可重定義該演算法中的某些特定步驟。型別 行為類模式 類圖 事實上,模版方法是程式設計中乙個經常用到的模式。先來看乙個例子,某日,程式設計師a拿到乙個任務 給定乙個整數陣列,把陣列中的數由小到大排序,然後把排序...

深入理解23種設計模式 12 模版方法模式

模版方法模式 template method pattern 又叫模版模式 template pattern 在乙個抽象類公開定義類執行它的方法的模版。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義但方式進行。模版方法模式定義類乙個操作中但演算法但骨架,而將一些步驟延遲到子類中,使得子類可以...