模板方法(template method)模式:定義乙個操作中的演算法骨架,而將演算法的一些步驟延遲到子類中,使得子類可以不改變該演算法結構的情況下重定義該演算法的某些特定步驟。
它是一種類行為型模式。
優點:1、它封裝了不變部分,擴充套件可變部分。
它把認為是不變部分的演算法封裝到父類中實現,而把可變部分演算法由子類繼承實現,便於子類繼續擴充套件。
2、它在父類中提取了公共的部分**,便於**復用。
3、部分方法是由子類實現的,因此子類可以通過擴充套件方式增加相應的功能,符合開閉原則。
缺點:1、對每個不同的實現都需要定義乙個子類,這會導致類的個數增加,系統更加龐大,設計也更加抽象。
2、父類中的抽象方法由子類實現,子類執行的結果會影響父類的結果,這導致一種反向的控制結構,它提高了**閱讀的難度。
模板方法模式需要注意抽象類與具體子類之間的協作。
它用到了虛函式的多型性技術以及「不用呼叫我,讓我來呼叫你」的反向控制技術。
模板方法模式的角色:
1、抽象類(abstract class):負責給出乙個演算法的輪廓和骨架。
它由乙個模板方法和若干個基本方法構成:
(1)模板方法:定義了演算法的骨架,按某種順序呼叫其包含的基本方法。
(2)基本方法:是整個演算法中的乙個步驟,包含以下幾種型別。
①抽象方法:在抽象類中申明,由具體子類實現。
②具體方法:在抽象類中已經實現,在具體子類中可以繼承或重寫它。
③鉤子方法:在抽象類中已經實現,包括用於判斷的邏輯方法和需要子類重寫的空方法兩種。
2、具體子類(concrete class):實現抽象類中所定義的抽象方法和鉤子方法,它們是乙個頂級邏輯的乙個組成步驟。
圖1 模板方法模式的結構圖
1、演算法的整體步驟很固定,但其中個別部分易變時,這時候可以使用模板方法模式,將容易變的部分抽象出來,供子類實現。
2、當多個子類存在公共的行為時,可以將其提取出來並集中到乙個公共父類中以避免**重複。
首先,要識別現有**中的不同之處,並且將不同之處分離為新的操作。然後,用乙個呼叫這些新的操作的模板方法來替換這些不同的**。
3、當需要控制子類的擴充套件時,模板方法只在特定點呼叫鉤子操作,這樣就只允許在這些點進行擴充套件。
在模板方法模式中,基本方法包含抽象方法、具體方法和鉤子方法,正確使用「鉤子方法」可以使子類控制父類的行為。
如例子中,可以通過在具體子類中重寫鉤子方法hookmethod1()和hookmethod2()來改變抽象父類中的執行結果,其結構圖如圖2所示。
圖2 含鉤子方法的模板方法模式的結構圖
圖3 示例**結構
抽象模板角色:
package
com.example.designpattern.template
;/**
* 抽象模板角色
* * @author administrator
* @date 2020/8/6
*/abstract
class
abstractbeverage
/** * 具體方法
*/public
final
void
boilwater()
/** * 抽象方法
* 衝飲料方法,由子類實現
*/public
abstract
void
brew()
;/**
* 具體方法
*/public
final
void
pourincup()
/** * 鉤子方法,一般空實現
* 新增輔料
*/public
void
addotherfood()
}
具體類角色1:
package
com.example.designpattern.template
;/**
* 具體類角色
* * @author administrator
* @date 2020/8/6
*/class
teaextends
abstractbeverage
}
具體類角色2:
package
com.example.designpattern.template
;/**
* 具體類角色
* * @author administrator
* @date 2020/8/6
*/class
coffee
extends
abstractbeverage
@override
public
void
addotherfood()
}
呼叫:
package
com.example.designpattern.template
;/**
* @author administrator
* @date 2020/8/6
*/class
client
}
測試結果:
圖4 測試結果
行為型模式 模板方法
結構圖 模式說明 1.擴充套件點在抽象類abstractclass的實現子類。2.每乙個實現子類實現一種抽象方法的演算法實現,子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。3.客戶端可以替換不同的子類實現。4.定義乙個操作的演算法骨架,而將一些步驟延遲到子類中實現,模板方法使得子類...
行為型模式 模板方法
定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。模板方法 template method 是乙個比較簡單的模式。它的主要思想是,定義乙個操作的一系列步驟,對於某些暫時確定不下來的步驟,就留給子類去實現好了,這樣不同的子類就可...
設計模式 行為型 模板方法模式
定義演算法框架,將一些步驟的實現延遲至子類,就是說把實現某一些功能會有一些重複的共有的步驟,放在公共的類中,將 不同的細節由其子類實現,例如炒菜,都要切菜,放油,和炒菜,但炒不同的菜需要放不同的調味料 定義乙個抽象類,將公共的方法提取出來構建模板方法,不同的則由其子類實現 create by hji...