模板方法模式(Template Method Pattern)
概要
記憶關鍵字:模板方法
定義:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重新定義該算法的某些特定步驟
類型:行爲型
UML類圖如下:
1. 涉及的角色
1)AbstractClass(抽象類)
是一個抽象模板,定義並實現了一個模板方法
2)ConcreteClass(具體實現類)
實現父類所定義的一個或多個抽象方法
2. 鉤子方法
當在模板方法中某一些步驟是可選的時候,也就是該步驟不一定要執行,可以由子類來決定是否要執行,則此時就需要用上鉤子。鉤子是一種被聲明在抽象類中的方法,但一般來說它只是空的或者具有默認值,子類可以實現覆蓋該鉤子,來設置算法步驟的某一步驟是否要執行。鉤子可以讓子類實現算法中可選的部分,讓子類能夠有機會對模板方法中某些一即將發生的步驟做出反應。
還是辦理業務的例子,如果來的客戶是vip客戶,那麼他就可以不必取號,可以直接辦理業務。 代碼如下:
1 public abstract class AbstractBusinessHandeler { 2 3 public final void execute(){ 4 if(!isVip()){//如果顧客是vip,則不用排隊 5 getRowNumber(); 6 } 7 handle(); 8 judge(); 9 } 10 11 public abstract boolean isVip();//抽象的鉤子方法,由子類實現 12 13 private void getRowNumber(){ 14 System.out.println("rowNumber-00" + RandomUtils.nextInt()); 15 } 16 17 public abstract void handle(); 18 19 private void judge(){ 20 System.out.println("give a praised"); 21 } 22 }
2. 模板模式優點
- 使用模板方法模式可以將代碼的公共行爲提取,以達到複用的目的。
- 而對於特殊化的行爲在子類中實現。父類的模板方法可以控制子類中的具體實現。
- 子類無需瞭解整體算法框架,只需實現自己的業務邏輯即可。
3. 模板模式缺點
- 子類執行的結果影響了父類的結果,這和我們平時設計習慣顛倒了,在複雜項目中,會帶來閱讀上的難度。
- 可能引起子類氾濫和爲了繼承而繼承的問題
4. 使用場景
1) java.util.AbstractList
2)java.util.AbstractMap
3)java.io.InputStream
4)AbstractApplicationContext 類中的 refresh() 方法
參考鏈接:https://www.cnblogs.com/54chensongxia/p/12508773.html