1. 程式人生 > >走進設計模式的世界8:想看演唱會就要講規矩-模板方法模式

走進設計模式的世界8:想看演唱會就要講規矩-模板方法模式

模板方法模式:

在一個方法中定義一個演算法骨架,而將一些步驟延遲到子類中。模板方法可以使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。

設計原則:不要給我打電話,我打給你。

解釋:模板方法定義了演算法的步驟,把這些步驟延遲到子類。模板方法模式為我們提供了一種程式碼複用的重要技巧。模板方法的抽象類可以定義具體方法,抽象方法,和鉤子。抽象方法由之類實現,具體方法子類不可重寫,鉤子子類方法根據情況,可以重寫。策略模式和模板方法模式都封裝了演算法。策略模式用組合,模板方法用繼承。工廠方法是模板方法的一種特殊版本。

模板方法樣例演示:想看演唱會就要講規矩。

// 演唱會入口的基類(抽象類)
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號門入場!");
    }
}

如例子所屬,模板方法模式可以讓父類嚴格的規定了子類所關注的,這也引出了一種設思路:不要給我打電話我打給你。由超類主導一切,當他們需要的時候會去呼叫子類。也就是不要給我打電話我會打給你的好萊塢模式。模板方法模式是幾乎用的最多的設計模式。所以一定要好好理解和使用。