定義一個功能的框架(骨架),一部分功能是確定的,一部分功能是不確定的,先把確定的部分實現,把不確定的部分延遲到子類中實現。
第一步:抽象類,實現模板方法,定義功能(確定的以及不確定的)的框架。
第二步:具體類,實現抽象類中的抽象方法,已完成完整的功能。
老規矩,最近想整一台BMW1系,去了趟4S店,店裡恰好有一台現車,但顏色我不太喜歡,這時服務顧問上來解釋說:“先生,您看中的這台車就這一個型號,外觀,發動機,內飾等配置都是一樣的,但顏色是可以個性化定制的,所以這個您不用擔心”。這裡大家該明白了,這就是一個典型的模板方法了,確定的功能是發動機,外觀,內飾等,不確定的就是顏色了。那我們就開始代碼實現了,畢竟作為程序員,只有敲好了代碼才買得起寶馬啊:
1 abstract class BuyCar{ 2 public void buy(){ 3 //確定的功能 4 System.out.println("歡迎來到寶馬4S店,我給你介紹下你選的這款車"); 5 System.out.println("外觀:兩廂,家族式雙腎柵格,典型的寶馬臉"); 6 System.out.println("發動機:2.0L雙渦管單渦輪增壓發動機"); 7 System.out.println("內飾:。。。。。。。。"); 8 System.out.println("這款車整體請看就是這樣,但顏色可以選擇,你想要白色還是紅色呢?"); 9 //不確定的功能選項 10 chooseColor(); 11 } 12 //對不確定功能定義抽象方法供具體類實現 13 public abstract void chooseColor(); 14 }
1 class Man extends BuyCar{ 2 public void chooseColor(){ 3 System.out.println("白色的"); 4 } 5 }
1 public class TemplateMethod{ 2 public static void main(String[] args){ 3 Man m = new Man(); 4 m.buy(); 5 } 6 }
1 歡迎來到寶馬4S店,我給你介紹下你選的這款車 2 外觀:兩廂,家族式雙腎柵格,典型的寶馬臉 3 發動機:2.0L雙渦管單渦輪增壓發動機 4 內飾:。。。。。。。。 5 這款車整體請看就是這樣,但顏色可以選擇,你想要白色還是紅色呢? 6 白色的
就這樣,我的購車之旅就結束了。也對模板方法有了新的感悟:
該模式有他的優點,比如說:
(1)模板方法模式通過把不變的行為搬移到超類,去除了子類中的重復代碼。
(2)子類實現算法的某些細節,有助於算法的擴展。
(3)通過一個父類調用子類實現的操作,通過子類擴展增加新的行為,符合“開放-封閉原則”。
但是缺點也同樣明顯:每個不同的實現都需要定義一個子類,這會導致類的個數的增加,設計更加抽象。