標籤:
咳咳,上課。
起立。
老師再見。???
你們就這麼希望老師走嗎。。。。
好了,同學們,今天這節課給大家介紹一下設計模式的一種——模板方法設計模式。
那麼什麼是模板方法設計模式呢?
當功能內部一部分實現是確定的,一部分實現是不確定的。這時可以把不確定的部分暴露出去,讓子類去實現。
模板方法模式是基於繼承的代碼複用的基本技術,模板方法模式的結構和用法也是物件導向設計的核心。
模式中的角色:
①抽象類別:實現了模板方法
②具體類:實現抽象類別中的抽象方法
通過一個例子來讓大家更容易理解。
當我們需要判斷一段程式啟動並執行時間的時候,程式如下:
1 class GetTime { 2 public void getTime() { 3 long start = System.currentTimeMillis(); 4 // 判斷這個迴圈執行的時間 5 for (int y = 0; y < 1000; y++) { 6 System.out.println(y); 7 } 8 long end = System.currentTimeMillis(); 9 System.out.println("毫秒是:" + (end - start));10 }11 }
可是,如果需要判斷的那段程式不確定怎麼辦呢?
這時可以把那段程式抽取成一個方法,需要判斷哪個程式,只需要修改這個方法即可。這種方式不好,當需求變更時,就需要修改這個類中的方法,違背了開閉原則,增加了開發成本,並且很容易出錯。
那麼我們可以把這個不確定的功能部分提取出來,通過抽象方法實現,當你需要判斷哪段程式的時候,可以通過子類去複寫實現。這樣做把不變的功能移到超類,通過子類擴充新的功能,有助於擴充,修改,符合開閉原則。
代碼如下:
1 abstract class GetTime { 2 public final void getTime() { // 此功能如果不需要複寫,可加final限定 3 long start = System.currentTimeMillis(); 4 code(); // 不確定的功能部分,提取出來,通過抽象方法實現 5 long end = System.currentTimeMillis(); 6 System.out.println("毫秒是:" + (end - start)); 7 } 8 9 public abstract void code(); // 抽象不確定的功能,讓子類複寫實現10 }11 12 class Demo extends GetTime {13 public void code() { // 子類複寫功能方法14 for (int y = 0; y < 1000; y++) {15 System.out.println("y");16 }17 }18 }
這樣做也是有缺點的,每個不同的實現都需要定義一個子類,這會導致類的個數的增加。
希望大家下去可以自行練習,把各種模式變成自己的習慣。
咳咳,下課
起立
老師再見
設計模式(三)__模板方法設計模式