設計模式 模板模式

2022-05-06 17:57:05 字數 2434 閱讀 5842

這是乙個很簡單的模式,卻被非常廣泛的使用。

之所以簡單是因為在這個模式中僅僅使用到了繼承關係。

繼承關係由於自身的缺陷,被專家們扣上了「罪惡」的帽子。

「使用委派關係代替繼承關係」,

「盡量使用介面實現而不是抽象類繼承」等等專家警告,讓我們大家對繼承「另眼相看」。

其實,繼承還是有很多自身的優點所在。只是被大家濫用的似乎缺點更加明顯了。

合理的利用繼承關係,還是能對你的系統設計起到很好的作用的。

而模板方法模式就是其中的乙個使用範例。

模板方法(template method)模式:

定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。

使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。

這裡的演算法的結構,可以理解為你根據需求設計出來的業務流程。

特定的步驟就是指那些可能在內容上存在變數的環節。

可以看出來,模板方法模式也是為了巧妙解決變化對系統帶來的影響而設計的。

使用模板方法使系統擴充套件性增強,最小化了變化對系統的影響。

抽象類(abstract class):定義了一到多個的抽象方法,以供具體的子類來實現它們;而且還要實現乙個模板方法,來定義乙個演算法的骨架。該模板方法不僅呼叫前面的抽象方法,也可以呼叫其他的操作,只要能完成自身的使命。

具體類(concrete class):實現父類中的抽象方法以完成演算法中與特定子類相關的步驟。

直接把《設計模式》上的圖拿過來用下

junit 中的 testcase 以及它的子類就是乙個模板方法模式的例子。

在 testcase 這個抽象類中將整個測試的流程設定好了,比如

先執行 setup 方法初始化測試前提,

在執行測試方法,

然後再 teardown 來取消測試設定。

但是你將在 setup、teardown 裡面作些什麼呢?鬼才知道呢!!

因此,而這些步驟的具體實現都延遲到子類中去,也就是你實現的測試類中。

來看下相關的源**吧。

這是 testcase 中,執行測試的模板方法。

public

void runbare() throws

throwable

finally

}

view code

你可以看到,裡面正像前面定義中所說的那樣,它制定了「演算法」的框架——先執行 setup 方法來做下初始化,然後執行測試方法,最後執行 teardown 釋放你得到的資源。

protected

void setup() throws

exception

protected

void teardown() throws

exception

view code

這就是上面使用的兩個方法。

與定義中不同的是,這兩個方法並沒有被實現為抽象方法,而是兩個空的無為方法(被稱為鉤子方法)。

這是因為在測試中,我們並不是必須要讓測試程式使用這兩個方法來初始化和釋放資源的。

如果是抽象方法,則子類們必須給它乙個實現,不管用到用不到。這顯然是不合理的。

使用鉤子方法,則你在需要的時候,可以在子類中重寫這些方法。

根據上面對定義的分析,以及例子的說明,可以看出模板方法適用於以下情況

一次性實現乙個演算法的不變的部分,並將可變的行為留給子類來實現。

各子類中公共的行為應被提取出來並集中到乙個公共父類中以避免**重複。其實這可以說是一種好的編碼習慣了。

控制子類擴充套件。模板方法只在特定點呼叫操作,這樣就只允許在這些點進行擴充套件。

比如上面 runbare()方法就只在 runtest 前面適用 setup 方法。

如果你不願子類來修改你的模板方法定義的框架,你可以採用兩種方式來做:

一是在 api 中不體現出你的模板方法;

或者將你的模板方法置為 final 就可以了。

可以看出(優點):

使用模板方法模式可以將**的公共行為提取出來,達到復用的目的。

而且,在模板方法模式中,是由父類的模板方法來控制子類中的具體實現。這樣你在實現子類的時候,根本不需要對業務流程有太多的了解。

@成鵬致遠

(blogs:lcw.cnblogs.com)

(email[email protected]

(qq552158509)

模板設計模式 設計模式 模板方法模式

在模板模式 template pattern 中,乙個抽象類公開定義了執行它的方法的方式 模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。首先需要一定抽象的定義,沒有具體的實現,但是在抽象類的行為中,子類去程序這個抽象類,重寫抽象方法,實現不...

模板設計模式 設計模式之模板模式

模板模式,通常又叫做模板方法模式,乙個抽象類公開定義了執行方法的模板,它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方法進行,這種型別的設計模式屬於行為型模式。模板模式主要解決將通用的演算法抽象起來,同樣的 邏輯出現了重複,就可以使用模板模式進行重構。關鍵 在抽象類實現,其他步驟在子類實現...

設計模式 模板設計模式

1 抽象類 abstractclass類中實現了模板方法 template 定義了演算法的骨架,具體子類需要去實現,抽象方法operationr2,3,4 template operationr2,3,4可以是抽象方法,也可以是實現方法 如果是抽象方法,需要到子類實現即可 2 實現類 concret...