设计模式(二)模板方法模式
1.模版方法模式簡介
模版方法模式介紹
在軟件開發中,有時會遇到類似的情況,某個方法的實現需要多個步驟,其中有些步驟是固定的,而有些步驟并不固定,存在可變性。為了提高代碼的復用性和系統的靈活性,可以使用模板方法模式來應對這類情況。
模版方法模式定義
定義一個操作中的算法框架,而將一些步驟延遲到子類中,使得子類可以不改變一個算法的結構即可重定義算法的某些特定步驟。
模版方法模式結構圖
- AbstractClass:抽象類,定義了一套算法。
- ConcreteClass:具體實現類。
2.模版方法模式的簡單實現
①創建抽象類,定義算法框架
一個武俠要戰斗的時候,也有一套固定的通用模式,那就是運行內功、開通經脈、準備武器和使用招式,我們把這些用代碼表示就是:
1 public abstract class AbstractSwordsman { 2 //該方法為final,防止算法框架被覆寫 3 public final void fighting(){ 4 //運行內功,抽象方法 5 neigong(); 6 //調整經脈,具體方法 7 meridian(); 8 //如果有武器則準備武器 9 if(hasWeapons()) { 10 weapons(); 11 } 12 //使用招式 13 moves(); 14 //鉤子方法 15 hook(); 16 } 17 //空實現方法 18 protected void hook(){} 19 protected abstract void neigong(); 20 protected abstract void weapons(); 21 protected abstract void moves(); 22 protected void meridian(){ 23 System.out.println("開通正經與奇經"); 24 } 25 26 /** 27 * 是否有武器,默認是有武器的,鉤子方法 28 * @return 29 */ 30 protected boolean hasWeapons(){ 31 return true; 32 } 33 }需要注意的是這個抽象類包含了三種類型的方法,分別是抽象方法、具體方法和鉤子方法。抽象方法是交由子類去實現,具體方法則在父類實現了子類公共的方法實現,在上面的例子就是武俠開通經脈的方式都一樣,所以就在具體方法中實現。鉤子方法則分為兩類,第一類是15行,它有一個空實現的方法,子類可以視情況來決定是否要覆蓋它;第二類則是第9行,這類鉤子方法的返回類型通常是bool類型的,一般用于對某個條件進行判斷,如果條件滿足則執行某一步驟,否則將不執行。
②定義具體實現類
本文就拿張無忌、張三豐來作為例子:
1 public class ZhangWuJi extends AbstractSwordsman { 2 3 @Override 4 protected void neigong() { 5 System.out.println("運行九陽神功"); 6 } 7 8 @Override 9 protected void weapons() { 10 } 11 12 @Override 13 protected void moves() { 14 System.out.println("使用招式乾坤大挪移"); 15 } 16 17 @Override 18 protected boolean hasWeapons() { 19 return false; 20 } 21 }張無忌沒有武器所以hasWeapons方法返回false,這樣也不會走weapons方法了。
1 public class ZhangSanFeng extends AbstractSwordsman { 2 3 @Override 4 protected void neigong() { 5 System.out.println("運行純陽無極功"); 6 } 7 8 @Override 9 protected void weapons() { 10 System.out.println("使用真武劍"); 11 } 12 13 @Override 14 protected void moves() { 15 System.out.println("使用招式神門十三劍"); 16 } 17 18 @Override 19 protected void hook() { 20 System.out.println("突然肚子不舒服,老夫先去趟廁所"); 21 } 22 }最后張三豐突然肚子不舒服所以就實現了鉤子方法hook。
③客戶端調用
1 public class Client { 2 public static void main(String[] args) { 3 ZhangWuJi zhangWuJi=new ZhangWuJi(); 4 zhangWuJi.fighting(); 5 ZhangSanFeng zhangSanFeng=new ZhangSanFeng(); 6 zhangSanFeng.fighting(); 7 } 8 }運行結果:
運行九陽神功
開通正經與奇經
使用招式乾坤大挪移
運行純陽無極功
開通正經與奇經
使用真武劍
使用招式神門十三劍
突然肚子不舒服,老夫先去趟廁所
?
3.模版方法模式的優缺點和使用場景
優點
- 模板方法模式通過把不變的行為搬移到超類,去除了子類中的重復代碼。
- 子類實現算法的某些細節,有助于算法的擴展。
缺點
- 每個不同的實現都需要定義一個子類,這會導致類的個數的增加,設計更加抽象。
使用場景
- 各子類中公共的行為應被提取出來并集中到一個公共父類中以避免代碼重復。
- 面對重要復雜的算法,可以把核心算法設計為模版方法,周邊相關細節功能則有各個子類實現。
- 需要通過子類來決定父類算法中某個步驟是否執行,實現子類對父類的反向控制。
總結
以上是生活随笔為你收集整理的设计模式(二)模板方法模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flexible 弹性盒子模型之CSS
- 下一篇: 前端机试面试题