走進設計模式的世界8:想看演唱會就要講規矩-模板方法模式
阿新 • • 發佈:2018-11-14
模板方法模式:
在一個方法中定義一個演算法骨架,而將一些步驟延遲到子類中。模板方法可以使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。
設計原則:不要給我打電話,我打給你。
解釋:模板方法定義了演算法的步驟,把這些步驟延遲到子類。模板方法模式為我們提供了一種程式碼複用的重要技巧。模板方法的抽象類可以定義具體方法,抽象方法,和鉤子。抽象方法由之類實現,具體方法子類不可重寫,鉤子子類方法根據情況,可以重寫。策略模式和模板方法模式都封裝了演算法。策略模式用組合,模板方法用繼承。工廠方法是模板方法的一種特殊版本。
模板方法樣例演示:想看演唱會就要講規矩。
// 演唱會入口的基類(抽象類) public abstract class Entrance{ final void watchConcert(){ // 買票 buyTicket(); // 檢票 checkTicket(); // 入場 entrance(); // 就坐 sit(); // 分發應援物 giving(); // 看演唱會 watch(); } // 由於不同的觀眾入場的方式不一樣,所以具體的實現延遲到子類。 abstract void entrance(); // 分發應援物(模板方法中的鉤子,粉絲會的入場需要重寫方法,其他人不需要) void giving(){ } // 買票 為公共方法之類不可重寫 final void buyTicket(){ System.out.println("購票成功!"); } // 檢票 為公共方法之類不可重寫 final void checkTicket(){ System.out.println("檢票成功!"); } // 就坐 為公共方法之類不可重寫 final void sit(){ System.out.println("就坐成功!"); } // 看演唱會 為公共方法之類不可重寫 final void watch(){ System.out.println("演唱會開始!"); } } // 粉絲協會入場 public class FansEntrance extends Entrance{ // 重寫鉤子,實現分發應援物。 void giving{ System.out.println("分發應援物成功!"); } // 實現父類抽象方法 void entrance(){ System.out.println("粉絲協會會員從1號門入場!"); } } // 散客入場 public class OtherFansEntrance extends Entrance{ // 不會分發應援物所以不用重寫鉤子 // 實現父類抽象方法 void entrance(){ System.out.println("散客從2號門入場!"); } }
如例子所屬,模板方法模式可以讓父類嚴格的規定了子類所關注的,這也引出了一種設思路:不要給我打電話我打給你。由超類主導一切,當他們需要的時候會去呼叫子類。也就是不要給我打電話我會打給你的好萊塢模式。模板方法模式是幾乎用的最多的設計模式。所以一定要好好理解和使用。